如何将Func<T, bool>用作Func<object, bool>的参数?

3

我有一个声明如下的方法:

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

我希望从通用方法中调用它,该方法的声明如下:

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

我该如何做到这一点?


实际问题在于 Func<T, bool> 可能会调用 T 的成员,而这些成员在 object 中未实现。由于 OriginalMethod 使用对象参数调用它,编译器无法确定 Func<T, bool> 是否与其兼容。请注意,使用 OriginalMethod 的选择器调用 GenericMethod 可行,因为 T 被保证包含了对象的所有成员的实现,因此使用 T 参数调用 Func<object, bool> 是可以接受的。任何提出的答案都要求您确信您的 T 选择器仅使用 object 的成员,或者 OriginalMethod 仅传递 T 派生参数。 - Elideb
3个回答

6

你不能直接将 selector 传递给 OriginalMethod:它期望一个接受任何 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的答案一样简洁明了。


3
OriginalMethod(arg => selector((T)arg));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接