10

Actionデリゲートのリストを含むオブジェクトからスイートにテストメソッドを動的に追加するNUnitアドインを開発しようとしています。問題は、NUnitが仕事を成し遂げるために熟考に大きく依存しているように見えることです。Actionしたがって、スイートに直接自分を追加する簡単な方法はないようです。

代わりに、オブジェクトを追加する必要がありMethodInfoます。これは通常は機能しますが、Actionデリゲートは匿名であるため、これを実現するためのタイプとメソッドを作成する必要があります。を使用せずに、これを行うためのより簡単な方法を見つける必要がありますEmit。アクションデリゲートからMethodInfoインスタンスを簡単に作成する方法を知っている人はいますか?

4

3 に答える 3

18

Action の Method プロパティを試しましたか? 私は次のようなことを意味します:

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

を「作成」する必要はありません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 に答える