通过反射抛出异常

Age*_*unt 4 c# reflection

这不是常见的情况.我试图通过反射调用异常.我有类似的东西:testMethod是MethodBuilder类型

testMethod.GetILGenerator().ThrowException(typeof(CustomException));
Run Code Online (Sandbox Code Playgroud)

我的CustomException没有默认构造函数,因此上面的语句错误地给出了ArgumentException.如果有默认构造函数,这可以正常工作.

那么有没有办法,这可以使用没有默认的构造函数?已经尝试了2个小时了.:(

任何帮助表示赞赏.

谢谢!

Jar*_*Par 5

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)