2

この回答でプロパティの名前を取得する安全なリファクタリング方法を知っています。メソッドの名前を取得する安全なリファクタリング方法はありますか?

C# 5 と .Net 4.5 を使用しています。

私がやろうとしていることを説明するには:

class MyClass
{
    public void UnitTestOne() { /* impl */ }
    public void UnitTestTwo() { /* impl */ }
    public void UnitTestThree() 
    {
        //I'd like to get the method names for UnitTestOne and UnitTestTwo here
        //in such a way that this code will raise a compile time error if either 
        //the UnitTestOne or UnitTestTwo method names changes. 
    } 
}
4

2 に答える 2

3

更新: これは、リファクタリング セーフ コードを使用して 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().

于 2013-06-10T06:27:11.820 に答える