ThrowException через отражение - PullRequest
4 голосов
/ 20 ноября 2010

Это не распространенный сценарий.Я пытаюсь вызвать исключение через отражение.У меня есть что-то вроде: testMethod имеет тип MethodBuilder

testMethod.GetILGenerator().ThrowException(typeof(CustomException));

У моего CustomException нет конструктора по умолчанию, поэтому вышеприведенный оператор выдает ошибку, дающую ArgumentException.Если есть конструктор по умолчанию, это прекрасно работает.

Так есть ли способ, который может работать без конструктора по умолчанию?Пытаюсь уже 2 часа.: (

Любая помощь приветствуется.

Спасибо!

Ответы [ 2 ]

5 голосов
/ 20 ноября 2010

Метод ThrowException сводится к следующему:

Emit(OpCodes.NewObj, ...);
Emit(OpCodes.Throw);

. Ключом здесь является замена первых вызовов 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);
2 голосов
/ 20 ноября 2010

См. Документацию :

// This example uses the ThrowException method, which uses the default 
// constructor of the specified exception type to create the exception. If you
// want to specify your own message, you must use a different constructor; 
// replace the ThrowException method call with code like that shown below,
// which creates the exception and throws it.
//
// Load the message, which is the argument for the constructor, onto the 
// execution stack. Execute Newobj, with the OverflowException constructor
// that takes a string. This pops the message off the stack, and pushes the
// new exception onto the stack. The Throw instruction pops the exception off
// the stack and throws it.
//adderIL.Emit(OpCodes.Ldstr, "DoAdd does not accept values over 100.");
//adderIL.Emit(OpCodes.Newobj, _
//             overflowType.GetConstructor(new Type[] { typeof(String) }));
//adderIL.Emit(OpCodes.Throw);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...