Как я могу создать MethodInfo из делегата Action - PullRequest
10 голосов
/ 05 апреля 2010

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

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

Ответы [ 3 ]

13 голосов
/ 05 апреля 2010

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

MethodInfo GetMI(Action a)
{
    return a.Method;
}
5 голосов
/ 05 апреля 2010

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

Action action = () => Console.WriteLine("Hello world !");
MethodInfo method = action.Method
1 голос
/ 05 апреля 2010
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 сможет потом что-либо успешно вызывать.

...