2015-01-06 24 views
5

我知道我在問奇怪的事情,但只是爲了踢,是否有可能得到一個lambda表達式的MethodInfo獲得一個lambda表達式的方法信息

我這樣的事情後:

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

UPDATE 我想獲得方法的信息不管LAMDA的身體是一個方法調用表達與否,即不管拉姆達的身體是什麼類型的表達。

因此,對於例如

這可能有效。

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

我對創建表達式不感興趣。我在下面添加了更新以迴應Timothy Shields的回答。我想要的只是一個委託的methodInfo。可能? –

+1

This works fine'(new 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

但是怎麼會有多個訂閱者使用匿名方法或lambda?你甚至可以在除聲明之外的任何地方引用它? –

+0

您必須首先聲明委託,然後使用'+ ='添加其他訂閱者。我同意,與匿名代表,這種情況是不太可能的。你可以檢查它,或者在這種情況下'Method'可能爲空。另外請注意,如果'Target'屬性不爲空,委託可能會有一些上下文。 – leppie

+0

啊,現在我明白你的意思了。你說的是,如果'Func '在其調用列表中已經有其他方法,那就小心點吧? –

2

使用System.Linq.Expressions命名空間,你可以做到以下幾點。

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

有趣的破解。謝謝。 :-) –

+0

不,等等。這隻適用於這個特定的例子。我的錯。我應該澄清。我希望它能夠工作,無論lambda包含什麼內容。這個解決方案假設lambda的主體是一個方法調用表達式,這是我的錯,因爲我舉了一個例子。 –