这不是常见的情况.我试图通过反射调用异常.我有类似的东西:testMethod是MethodBuilder类型
testMethod.GetILGenerator().ThrowException(typeof(CustomException));
Run Code Online (Sandbox Code Playgroud)
我的CustomException没有默认构造函数,因此上面的语句错误地给出了ArgumentException.如果有默认构造函数,这可以正常工作.
那么有没有办法,这可以使用没有默认的构造函数?已经尝试了2个小时了.:(
任何帮助表示赞赏.
谢谢!
该ThrowException
方法基本归结为以下内容
Emit(OpCodes.NewObj, ...);
Emit(OpCodes.Throw);
Run Code Online (Sandbox Code Playgroud)
这里的关键是用Emit
创建自定义异常实例所需的一组IL指令替换第一个调用.然后添加Emit(OpCodes.Throw)
例如
class MyException : Exception {
public MyException(int p1) {}
}
var ctor = typeof(MyException).GetConstructor(new Type[] {typeof(int)});
var gen = builder.GetILGenerator();
gen.Emit(OpCodes.Ldc_I4, 42);
gen.Emit(OpCodes.NewObj, ctor);
gen.Emit(OpCodes.Throw);
Run Code Online (Sandbox Code Playgroud)