2011-12-19 118 views
3

我有聲明的方法是這樣的:如何使用Func <T, bool>作爲Func <object,bool>的參數?

public void OriginalMethod(Func<object,bool> selector) 

而且我想從泛型方法調用它,有聲明是這樣的:

public void GenericMethod<T>(Func<T, bool> selector) 

我該怎麼辦呢?

+0

實際的問題是,Func鍵可能會呼叫未在對象中實現的T的成員。由於OriginalMethod使用對象參數調用它,因此編譯器無法確定Func 將與其兼容。注意,調用GenericMethod和OriginalMethod的選擇器是如何工作的,因爲T保證包含所有對象成員的實現,所以調用Func 可以接受T參數。任何建議的答案都要求您確定您的T選擇器使用對象的成員,或者OriginalMethod只傳遞T衍生的參數。 – Elideb 2011-12-19 14:52:08

回答

6

不能直接傳遞到selectorOriginalMethod:它預期接受任何object的方法,而是一個Func<T, bool>只接受T類型的對象。

當然,你可以欺騙:

OriginalMethod(o => selector((T)o)); 

但如果OriginalMethod調用與對象不是轉換爲T的方法,它將會失敗......

3

你需要創建一個Func<object, bool>調用在鍵入一個通過。

public void GenericMethod<T>(Func<T, bool> selector) 
{ 
    Func<object, bool> untypedSelector = (object obj) => selector((T)obj); 

    OriginalMethod(untypedSelector); 
} 

要麼像上面,或一個班輪像Marc's answer

3
OriginalMethod(arg => selector((T)arg)); 
相關問題