我有聲明的方法是這樣的:如何使用Func <T, bool>作爲Func <object,bool>的參數?
public void OriginalMethod(Func<object,bool> selector)
而且我想從泛型方法調用它,有聲明是這樣的:
public void GenericMethod<T>(Func<T, bool> selector)
我該怎麼辦呢?
我有聲明的方法是這樣的:如何使用Func <T, bool>作爲Func <object,bool>的參數?
public void OriginalMethod(Func<object,bool> selector)
而且我想從泛型方法調用它,有聲明是這樣的:
public void GenericMethod<T>(Func<T, bool> selector)
我該怎麼辦呢?
不能直接傳遞到selector
OriginalMethod
:它預期接受任何object
的方法,而是一個Func<T, bool>
只接受T
類型的對象。
當然,你可以欺騙:
OriginalMethod(o => selector((T)o));
但如果OriginalMethod
調用與對象不是轉換爲T的方法,它將會失敗......
你需要創建一個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。
OriginalMethod(arg => selector((T)arg));
實際的問題是,Func鍵可能會呼叫未在對象中實現的T的成員。由於OriginalMethod使用對象參數調用它,因此編譯器無法確定Func 將與其兼容。注意,調用GenericMethod和OriginalMethod的選擇器是如何工作的,因爲T保證包含所有對象成員的實現,所以調用Func