Как я могу создать MethodInfo из делегата Action

Я пытаюсь разработать надстройку NUnit, которая динамически добавляет методы тестирования в комплект из объекта, который содержит список Action делегаты. Проблема в том, что NUnit, кажется, сильно полагается на рефлексию, чтобы выполнить работу. Следовательно, похоже, что нет простого способа добавить мой Actionнепосредственно в номер.

Я должен вместо этого добавить MethodInfo объекты. Это будет нормально работать, но Action делегаты являются анонимными, поэтому мне придется создавать типы и методы для этого. Мне нужно найти более простой способ сделать это, не прибегая к использованию Emit, Кто-нибудь знает, как легко создавать экземпляры MethodInfo из делегатов Action?

3 ответа

Решение

Вы пробовали свойство метода Action? Я имею в виду что-то вроде:

MethodInfo GetMI(Action a)
{
    return a.Method;
}

Вам не нужно "создавать" MethodInfoВы можете просто получить его от делегата:

Action action = () => Console.WriteLine("Hello world !");
MethodInfo method = action.Method
MethodInvoker CvtActionToMI(Action d)
{
   MethodInvoker converted = delegate { d(); };
   return converted;
}

Извините, не то, что вы хотели.

Обратите внимание, что все делегаты являются многоадресными, поэтому не гарантируется, что MethodInfo, Это даст вам все из них:

MethodInfo[] CvtActionToMIArray(Action d)
{
   if (d == null) return new MethodInfo[0];
   Delegate[] targets = d.GetInvocationList();
   MethodInfo[] converted = new MethodInfo[targets.Length];
   for( int i = 0; i < targets.Length; ++i ) converted[i] = targets[i].Method;
   return converted;
}

Однако вы теряете информацию о целевых объектах (не обращаясь к делегату), поэтому я не ожидаю, что NUnit сможет впоследствии успешно что-либо вызывать.

Другие вопросы по тегам