更新: これは、リファクタリング セーフ コードを使用して MethodInfos にアクセスするための柔軟なユーティリティ メソッドを説明し、提供する素晴らしい投稿です。 http://www.codeducky.org/10-utilities-c-developers-should-know-part-two/
無効なパラメーターのないメソッドのみをカバーしたい場合は、Jon Skeetの答えで問題ないと思います。より一般的な解決策は次のようになります。
public class MyClass
{
public void UnitTestOne(int i) { /* impl */ }
public int UnitTestTwo() { /* impl */ }
public void UnitTestThree()
{
var methodCallExpressions = new Expression<Action<MyClass>>[] {
mc => mc.UnitTestOne(default(int)), //Note that a dummy argument is provided
mc => mc.UnitTestTwo()
};
var names = methodCallExpressions.Select(mce =>
((MethodCallExpression) mce.Body).Method.Name);
}
}
各メソッド呼び出しの戻り値の型とパラメーターの型を知らなくても、Expression<Action<MyClass>>
メソッド呼び出しのリストを作成するためにの配列を使用していることに注意してください。MyClass
各メソッド呼び出し式には、式をインスタンス化するためのダミー変数が用意されています。
次に、各式の本体はMethodCallExpression
、型名が示すように、メソッドの呼び出しである式を保持する にキャストされます。その型には、呼び出されるメソッドのMethod
プロパティがあります。MethodInfo
あなたが提供したリンクでは、プロパティ名は を使用して同様に抽出されMemberExpression
ます。を使用MethodCallExpression
すると、例が非常に似たものになります。
ちなみに、お好みExpression<Action>
で代わりに使うこともできExpression<Action<MyClass>>
ます。methodCallExpressions
インスタンス化を次のものに置き換えます。
var methodCallExpressions = new Expression<Action>[] {
() => this.UnitTestOne(default(int)),
() => this.UnitTestTwo()
};
これは主に文体上の決定だと思いますが、() => (new MyClass2()).UnitTestThree()
.