我正在尝试开发一个NUnit插件,它可以从包含Action
个委托列表的对象动态地将测试方法添加到套件中。问题在于NUnit似乎非常倾向于反思以完成工作。因此,看起来没有简单的方法可以将Action
直接添加到套件中。
相反,我必须添加MethodInfo
个对象。这通常有效,但Action
代表是匿名的,所以我必须构建完成此任务的类型和方法。我需要找到一种更简单的方法来执行此操作,而无需使用Emit
。有谁知道如何从Action代理中轻松创建MethodInfo实例?
答案 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能够在之后成功调用任何内容。