2012-02-10 15 views
0

特定の入力からmethodinfoクラスを返すメソッドを記述しようとしています。そのメソッドの汎用バージョンを作成するためのビューがあります。MethodGroupを汎用パラメータとして使用する

var m = myClass.GetType().GetMethod("SomeMethod").MakeGenericMethod(...blahblah..); 

これは動作し、すべての良いですが、私は私のメソッド名の文字列リテラルを持っているので、リファクタリングの過程で、私は、私は私がいない使用していますのいずれかの方法で名前を変更するために起こる場合を除き、実行時まで見つけてください。

私がしたいのは、メソッド群を指定するlambaを渡すことができるヘルパーメソッドを作成することです。その方法では、intellisenseなどの言及はしませんが、メソッド名のコンパイル時のチェックが行われます。

MethodInfo mi = myClass.GetMethodInfo(o => o.SomeMethod); 
m = mi.MakeGenericMethod(..blah...); 

しかし、私はヘルパーのメソッドのシグネチャを把握することができていない...

public MethodInfo GetMethodInfo(Func<MyClass,XXXX> lambda){ //What is my XXXX ? } 
+0

あなた 'SomeMethod'の署名がどのようなものが見えますか? –

+0

これは実際にはポイント@M.Babcockの可能性があり、おそらくそれが異なるため、特定のメソッドシグネチャではなくメソッドグループから解決したいのです。 –

+0

私はこれが可能だとは思わないが、私は間違っている可能性がある。 'Func'はラムダに何を渡すべきかを知っていますが、どうすればそれを知ることができますか? –

答えて

5

あなたはこのようにそれを行うことができますが、私はあなたが必要な理由として困惑していますデリゲートタイプを指定します。それが機能しないことがなければ、しかし、以下のBarMethodのために働くので、デリゲート型が何であるかは関係していないよう:

public static void Main(String[] args) 
{ 
    Foo f = new Foo(); 
    Console.WriteLine(ForMethod(() => f.FooMethod()).Name); 
    Console.WriteLine(ForMethod(() => f.Foo2Method<String>()).Name); 
    Console.WriteLine(ForMethod(() => f.BarMethod("foo")).Name); 
    Console.ReadKey(); 
} 

public static MethodInfo ForMethod(Expression<Action> e) 
{ 
    var mi = ((MethodCallExpression) e.Body).Method; 
    if (mi.IsGenericMethod) 
     mi = mi.GetGenericMethodDefinition(); 
    return mi; 
} 

class Foo 
{ 
    public void FooMethod() { } 
    public void Foo2Method<T>() { } 
    public void BarMethod(String foo) { } 
} 
+0

私はこれについても考えましたが、その質問に基づいて、メソッドは汎用メソッドになる可能性が高いので、メソッドが汎用メソッドであるかどうかを確認し、基になるメソッド定義を取得する必要があります –

+0

その可能性をカバーするように編集されました。それが価値あるものについては、ほぼ確実に良い方法です。 –

+0

+1 - 私は訂正します。よくできました! –

関連する問題