2015-01-06 15 views
5

私はちょうど蹴りのための奇妙なしかしを求めています知っているためMETHODINFOを取得し、それは、ラムダ式のためMethodInfoを取得することは可能でしょうか?、ラムダ式

私はこのような何かの後にしています:

(Func<int, string>(i => i.ToString())).MethodInfo

UPDATE 私はすなわち関わらず、関わらず、ラムダの本体は、メソッド呼び出し式であるかどうかの方法で情報を取得したいですラムダの本体がどのような表現式であるか。

です。

これは機能する場合があります。

var intExpression = Expression.Constant(2); 
Expression<Func<int, Dog>> conversionExpression = i => Program.GetNewDog(i); 

var convertExpression5 = Expression.ConvertChecked(intExpression, typeof(Dog), ((MethodCallExpression)(conversionExpression.Body)).Method); 

class Program 
{ 
    static Dog GetNewDog(int i) 
    { 
    return new Dog(); 
    } 
} 

しかし、私もこの仕事をしたい:

var intExpression = Expression.Constant(2); 
Expression<Func<int, Dog>> conversionExpression = i => new Dog(); 

var convertExpression5 = Expression.ConvertChecked(intExpression, typeof(Dog), /*...???... */); 
+0

式はメソッドの情報を持っていません。コンパイルした場合は、デリゲートからメソッド情報を取得できます。 – leppie

+0

私は式の作成に興味がありません。私は下のティモシー・シールズの答えに応じてアップデートを加えました。私が望むのは、デリゲートからのmethodInfoだけです。可能? –

+1

これは '正常に動作します(新規のFunc (I => i.ToString()))。Method' – leppie

答えて

6

あなたはかなり接近している:)

あなたはこのような何かを行うことができます。

MethodInfo meth = (new Func<int, string>(i => i.ToString())).Method; 

注:デリゲートのインスタンスに複数の「加入者」を持っている場合、これは問題がある可能性があります。

MSDN:http://msdn2.microsoft.com/en-us/library/system.delegate.method

+0

しかし、匿名メソッドやラムダに複数のサブスクライバが存在する可能性はありますか?それが宣言されている場所以外のどこの場所でも、あなたはどのように参照しますか? –

+0

デリゲートを宣言してから、追加の加入者を追加するには '+ ='を使用する必要があります。私は、匿名の代理人と、このシナリオは非常にありそうでないことに同意します。あなたはそれを確認することができます。そうであれば 'Method'がnullになるかもしれません。また、 'Target'プロパティがnullでない場合、デリゲートがコンテキストを持っている可能性があることに注意してください。 – leppie

+0

ああ、今私はあなたが何を意味するかを見ます。 'Func 'にすでに呼び出しリストに他のメソッドがある場合は、注意してください。 –

2

System.Linq.Expressions名前空間を使用して、次の操作を行うことができます。

Expression<Func<int, string>> expression = i => i.ToString(); 
MethodInfo method = ((MethodCallExpression)expression.Body).Method; 
+0

面白いハック。ありがとうございました。 :-) –

+0

いいえ、お待ちください。これは、この特定の例でのみ機能します。私の悪い。私は明らかにすべきだった。私はラムダのボディに何が含まれているかに関わらず動作させたい。この解はラムダの本体がメソッド呼び出し式であると仮定しています。これは私がこのような例を与えたためです。 –