例如,请考虑以下代码段
Contract.Requires<CustomException>(arg !=null)
在运行时期间,以下代码将抛出类型CustomException
的异常。代码合约是否使用Activator来创建CustomException
的实例或我们如何使用它。我想在我的代码中实现类似的一个用于其他目的。
答案 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获取建议。