10

我正在尝试开发一个 NUnit 插件,它可以从包含Action委托列表的对象动态地将测试方法添加到套件中。问题是 NUnit 似乎严重依赖反射来完成工作。因此,似乎没有简单的方法可以将 my Actions 直接添加到套件中。

相反,我必须添加MethodInfo对象。这通常可以工作,但Action委托是匿名的,所以我必须构建类型和方法来完成这个。我需要找到一种更简单的方法来做到这一点,而无需使用Emit. 有谁知道如何从 Action 委托轻松创建 MethodInfo 实例?

4

3 回答 3

18

你试过 Action 的 Method 属性吗?我的意思是:

MethodInfo GetMI(Action a)
{
    return a.Method;
}
于 2010-04-05T02:52:58.517 回答
8

您不需要“创建” a MethodInfo,您可以从委托中检索它:

Action action = () => Console.WriteLine("Hello world !");
MethodInfo method = action.Method
于 2010-04-05T02:45:13.237 回答
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 能够在之后成功调用任何东西。

于 2010-04-05T02:24:44.750 回答