2016-07-16 31 views
1

例如,考虑在运行时下面的代码片段如何异常实例获取代码来实现合同

Contract.Requires<CustomException>(arg !=null) 

,下面的代码会抛出CustomException类型除外。代码合同是否使用Activator来创建CustomException的实例,或者我们如何使用它。我想在我的代码中实现一个类似的另一个目的。

回答

0

根据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寻求建议。