如何在代码契约中创建异常实例

时间:2016-07-16 16:56:39

标签: c# .net code-contracts

例如,请考虑以下代码段

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

在运行时期间,以下代码将抛出类型CustomException的异常。代码合约是否使用Activator来创建CustomException的实例或我们如何使用它。我想在我的代码中实现类似的一个用于其他目的。

1 个答案:

答案 0 :(得分: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获取建议。