2012-02-10 41 views
0

我想寫一個方法從給定的輸入中返回一個methodinfo類,以創建該方法的通用版本......即,MethodGroup作爲通用參數

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

這工作是所有好,但我有字符串字面我的方法的名字,因此,如果在重新分解的過程中,我碰巧重命名的方法之一,我用我不知道找出直到運行時間。

我想要做的是創建一個幫助器方法,我可以傳遞一個lamba來指定方法組,這樣我就可以編譯時間檢查方法名稱,更不用說智能感知等等。

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

但我一直無法弄清楚輔助的方法簽名......

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

是什麼的簽名你的'SomeMethod'是什麼樣子? – 2012-02-10 03:39:22

+0

實際上這就是@ M.Babcock的觀點,他們可能並可能會有所不同,這就是爲什麼我想從方法組中解析,而不是特定的方法簽名。 – 2012-02-10 03:44:25

+0

我不認爲這是可能的,但我可能是錯的。 'Func'希望知道要傳遞給lambda,如果你不知道那該怎麼辦? – 2012-02-10 03:50:08

回答

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

我也考慮過這個問題,但基於這個問題,這些方法很可能是通用方法,因此您需要檢查該方法是否爲通用方法,並編輯底層方法定義 – 2012-02-10 03:57:25

+0

以覆蓋此可能性。對於它的價值,幾乎肯定有更好的方法。 – 2012-02-10 04:00:36

+0

+1 - 我糾正了。幹得好! – 2012-02-10 04:03:11