2012-01-26 13 views
7

私は次のパターン機能を実装しようとしています:式ツリーからメソッド名を抽出しますか?

MethodInfo GetMethod(  
    Expression<Func<TTarget, EventHandler<TEventArgs>>> method) 

希望使い方がある

を必要に応じて、私はTTargetのインスタンスを提供することができます。ここでは

public static void Main(string[] args) 
{ 
    var methodInfo = GetMethod<Program, EventArgs>(t => t.Method); 
    Console.WriteLine("Hello, world!"); 
} 

private void Method(object sender, EventArgs e) 
{ 
} 

は、私が試したものですこれまでのところ:

private static MethodInfo GetMethod(TTarget target, Expression<Func<TTarget, EventHandler<TEventArgs>>> method) 
{ 
    var lambda = method as LambdaExpression; 
    var body = lambda.Body as UnaryExpression; 
    var call = body.Operand as MethodCallExpression; 
    var mInfo = call.Method as MethodInfo; 

    Console.WriteLine(mInfo); 

    throw new NotImplementedException(); 
} 

それが表示されます:

System.Delegate CreateDelegate(System.Type, System.Object, System.Reflection.Met hodInfo)

+0

質問を使用しているプログラミング言語でタグ付けすると便利です。 C#のように見えますが、わかりません。 – styfle

答えて

5

あなたは半分です。 以下のコードを見てください

public static void Main(string[] args) 
{ 
    var program = new Program(); 
    var methodInfo = GetMethod<Program, EventArgs>(()=> program.Method); 
    Console.WriteLine(methodInfo.Name); 
} 

そして、次のコードを使用してメソッド名を取得してください。

static MethodInfo GetMethod<TTarget, TEventArgs>(Expression<Func<EventHandler<TEventArgs>>> method) where TEventArgs:EventArgs 
{ 
    var convert = method.Body as UnaryExpression; 
    var methodCall = (convert.Operand as MethodCallExpression); 
    if (methodCall != null && methodCall.Arguments.Count>2 && methodCall.Arguments[2] is ConstantExpression) 
    { 
     var methodInfo = (methodCall.Arguments[2]as ConstantExpression).Value as MethodInfo; 
     return methodInfo; 
    } 
    return null; 
} 

これがあなたの質問に答えることを願っています。

+0

ありがとうございます。それは仕事をした! – Shimmy

関連する問題