2012-09-30 60 views
0

[簡體提問]檢測委託的參數在運行時泛型方法裏面

考慮下面的一般方法:

public T MyFunction<T>() 
{ 
// ... 
} 

而鑑於這就是所謂的以下列方式:

MyFunction<Action<int, string>>(); 

如何從MyFunction中的代碼中檢測T有哪些參數(因爲它是委託人)?

[你到底想幹什麼?!?!?!?]

我有需要知道參數T有空隙MyFunction<T>(Expression<Func<T>> delegateReturner);實際簽名的方法,而不實際調用該方法,從而它可以生成一個LINQ表達式。

+1

可以解析表達式樹http://msdn.microsoft.com/en-us/library/bb397951.aspx –

+0

除非我失去了一些東西,這不會幫助。類型是引用的地方是在表達式樹中的CreateDelegate()中,並且在那裏它們只是使用相同的T.所以我最終得到的是一個Type(我已經從typeof(T)獲得)。 –

+0

好的 - 我回過頭來,我能夠進一步查看lambda並找到相關的MethodInfo。但是,這使我的解決方案變弱(因爲它需要更多關於lambda表達式的知識)。是否沒有其他方式來確定typeof()的委託參數? –

回答

0

只要委託具有Action類型的void返回類型,就可以使用下面的代碼。

public static bool IsActionDelegate(Type sourceType) 
{ 
    if(sourceType.IsSubclassOf(typeof(MulticastDelegate)) && 
     sourceType.GetMethod("Invoke").ReturnType == typeof(void)) 
     return true; 
    return false; 
} 
+0

據我所知,我的代碼並不是試圖弄清楚這個類型是否是Action Delegate。它試圖找出參數的類型。 –