2011-12-19 117 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)); 
相关问题