Как я могу создать 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 сможет впоследствии успешно что-либо вызывать.