如何从Action委托创建MethodInfo

时间:2010-04-05 02:22:40

标签: c# .net reflection nunit-addins

我正在尝试开发一个NUnit插件,它可以从包含Action个委托列表的对象动态地将测试方法添加到套件中。问题在于NUnit似乎非常倾向于反思以完成工作。因此,看起来没有简单的方法可以将Action直接添加到套件中。

相反,我必须添加MethodInfo个对象。这通常有效,但Action代表是匿名的,所以我必须构建完成此任务的类型和方法。我需要找到一种更简单的方法来执行此操作,而无需使用Emit。有谁知道如何从Action代理中轻松创建MethodInfo实例?

3 个答案:

答案 0 :(得分:13)

您是否尝试过Action的Method属性?我的意思是:

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

答案 1 :(得分:5)

您无需“创建”MethodInfo,只需从代理中检索它即可:

Action action = () => Console.WriteLine("Hello world !");
MethodInfo method = action.Method

答案 2 :(得分:1)

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能够在之后成功调用任何内容。