Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过反射产生异常_C#_Reflection - Fatal编程技术网

C# 通过反射产生异常

C# 通过反射产生异常,c#,reflection,C#,Reflection,这不是常见的情况。我试图通过反射调用异常。我有点像: testMethod的类型为MethodBuilder testMethod.GetILGenerator().ThrowException(typeof(CustomException)); 我的CustomException没有默认构造函数,因此上面的语句在给出ArgumentException时出错。如果有一个默认构造函数,那么它可以正常工作 有没有一种方法可以在没有默认构造函数的情况下工作?我已经试了两个小时了( 感谢您的帮助 谢谢

这不是常见的情况。我试图通过反射调用异常。我有点像: testMethod的类型为MethodBuilder

testMethod.GetILGenerator().ThrowException(typeof(CustomException));
我的CustomException没有默认构造函数,因此上面的语句在给出ArgumentException时出错。如果有一个默认构造函数,那么它可以正常工作

有没有一种方法可以在没有默认构造函数的情况下工作?我已经试了两个小时了(

感谢您的帮助

谢谢!

请参阅:


throweexception
方法基本上可以归结为以下几点

Emit(OpCodes.NewObj, ...);
Emit(OpCodes.Throw);
这里的关键是将第一个
Emit
调用替换为创建自定义异常实例所需的一组IL指令。然后添加
Emit(opcode.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);
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);