1
例如,考虑在运行时下面的代码片段如何异常实例获取代码来实现合同
Contract.Requires<CustomException>(arg !=null)
,下面的代码会抛出CustomException
类型除外。代码合同是否使用Activator来创建CustomException
的实例,或者我们如何使用它。我想在我的代码中实现一个类似的另一个目的。
例如,考虑在运行时下面的代码片段如何异常实例获取代码来实现合同
Contract.Requires<CustomException>(arg !=null)
,下面的代码会抛出CustomException
类型除外。代码合同是否使用Activator来创建CustomException
的实例,或者我们如何使用它。我想在我的代码中实现一个类似的另一个目的。
根据Microsoft Reference Source,你参考的方法来实现这样的:
public static void Requires<TException>(bool condition) where TException : Exception
{
AssertMustUseRewriter(ContractFailureKind.Precondition, "Requires<TException>");
}
正如你可以看到,没有任何功能结合到通用TException
类型参数。这是因为编译后ccrewrite.exe
会处理这个问题。在你的泛型类型参数
首先,用new()
约束:
关于你的第二个问题,你总是可以创建一个给定类型的实例有两种不同的方式
public static void CreateInstance<TClass>() where TClass : new()
{
TClass instance = new TClass();
// ...
}
其次,通过使用反射Activator
:如果例如
public static void CreateInstanceWithReflection<TClass>()
{
TClass instance = Activator.CreateInstance<TClass>();
// ...
}
后者方法是有用不知道真正的类型,并希望首先通过反射进行搜索。请注意,通过反射来创建一个实例也需要你的类提供一个无参数的构造函数。如果没有,请参考question寻求建议。