2013-08-04 22 views
6

と同じクラスの別のメソッドの名前を取得することは可能ですか?手書きの文字列を使用していますか?既知のメソッドからメソッド名を取得する方法は?

class MyClass { 

    private void doThis() 
    { 
     // Wanted something like this 
     print(otherMethod.name.ToString()); 
    } 

    private void otherMethod() 
    { 

    } 
} 

あなたはなぜ尋ねることがあります。ほかの理由は、私は、この起動(「otherMethod」)のように、後にメソッドを呼び出す必要があるということです、しかし私はリファクタリングすることができないとして、この文字列を自分自身をハードコーディングする必要はありませんそれはもはやプロジェクト内にあります。

+0

それを達成するためにリフレクションを使用することができます。 –

+0

あなたはどのバージョンのC#を使用していますか? – Mehrdad

答えて

8

一つのアプローチは、あなたが、あなたはメソッドの名前にアクセスすることができ、デリゲートActionにそれをラップすることができます:

string name = new Action(otherMethod).Method.Name; 
+1

ありがとうございます!私はGetType()とGetMethods()を見ましたが、私が聞いたことのないこの新しいアクションです。小さな質問:私は新しいアクションを使用するとき、私はそのメソッドが実行されないことを望む(それは名前を取るだけです)、それは正しいですか? – Malvin

+2

デリゲートアプローチを使用する場合は、名前を取得する必要はありません(したがって、リフレクションによってスキップします)。後でメソッドを実行するために結果の 'Action'を使用します。 –

+2

うわー!かなり素晴らしい、私はあなたがそれを行うことができるか分からなかった。 –

2

あなたはリフレクション(例 - http://www.csharp-examples.net/get-method-names/)を使用することができるメソッド名を取得します。探しているメソッドを名前やパラメータで検索したり、タグを付けるために属性を使用することもできます。

しかし本当の質問は、あなたが必要としていることですか?これは、あなたが本当にリフレクションを必要としないかのように見えますが、デザインを考える必要があります。どのメソッドを呼び出すのか既に知っている場合は、なぜその名前が必要ですか?デリゲートを使うのはどうですか?または、インターフェイスを介してメソッドを公開し、それを実装するいくつかのクラスへの参照を格納しますか?ところで

MethodInfo method = this.GetType().GetMethod("otherMethod"); 
object result = method.Invoke(this, new object[] { }); 
1

はこれを試してみてください。私はまた、メソッドの文字列を取得するための代替ソリューションを(インターネットの拡張で)見つけました。それはまた、パラメータと戻り値の型で動作します:

System.Func<float, string> sysFunc = this.MyFunction; 
string s = sysFunc.Method.Name; // prints "MyFunction" 

public string MyFunction(float number) 
{ 
    return "hello world"; 
} 
0

+0

これは、受け入れられた回答によって使用されるアプローチです。 – Servy

+0

唯一の違いは、非voidメソッドでも機能することです。 – Malvin

+0

アプローチは同じですが、明らかに、メソッドのシグネチャに一致する 'Action' /' Func'タイプを使用する必要があります。 OPの例は、パラメータなしのvoid関数です。これは 'Action'を意味します。そのようなメソッドには 'Func'を使用できませんでした。 – Servy

関連する問題