C# 如何使用Func<;T、 布尔>;作为Func的参数<;对象,bool>;?

C# 如何使用Func<;T、 布尔>;作为Func的参数<;对象,bool>;?,c#,c#-4.0,C#,C# 4.0,我有一个声明如下的方法: public void OriginalMethod(Func<object,bool> selector) public void GenericMethod<T>(Func<T, bool> selector) public void OriginalMethod(函数选择器) 我想从泛型方法调用它,它的声明如下: public void OriginalMethod(Func<object,bool> sele

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

public void OriginalMethod(Func<object,bool> selector)
public void GenericMethod<T>(Func<T, bool> selector)
public void OriginalMethod(函数选择器)
我想从泛型方法调用它,它的声明如下:

public void OriginalMethod(Func<object,bool> selector)
public void GenericMethod<T>(Func<T, bool> selector)
public void GenericMethod(函数选择器)

怎么做?

您需要创建一个
Func
,调用传入的类型函数

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

    OriginalMethod(untypedSelector);
}
public void GenericMethod(函数选择器)
{
Func untypedSelector=(object obj)=>选择器((T)obj);
原始方法(非类型选择器);
}

要么像上面那样,要么像一行程序一样。

您不能将
选择器
直接传递给
原始方法
:它要求一个方法接受任何
对象
,但
函数
只接受
t
类型的对象

当然,你可以作弊:

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

但是,如果
OriginalMethod
使用不可转换为T的对象调用该方法,它将失败…

实际问题是Func可能会调用未在对象中实现的T的成员。由于OriginalMethod使用对象参数调用它,编译器无法确保Func与它兼容。请注意使用OriginalMethod的选择器调用GenericMethod是如何工作的,因为T保证包含所有对象成员的实现,所以使用T参数调用Func是可以接受的。任何建议的答案都需要确保T选择器使用对象的成员或原始方法只传递T派生的参数。