Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ-使用谓词调用筛选器<;T>;_C#_Linq - Fatal编程技术网

C# LINQ-使用谓词调用筛选器<;T>;

C# LINQ-使用谓词调用筛选器<;T>;,c#,linq,C#,Linq,我想在我的一个类中提供一种过滤某些元素的方法。为了使我的界面尽可能干净和自解释,我希望我的过滤器属性是一个谓词 下面是一个简单的例子: 公共类ObjectAdapter { 公共对象适配器() { MemberFilter=DefaultFilter; } 公共谓词MemberFilter{get;set;} 公共虚拟bool DefaultFilter(PropertyInfo信息) { 如果(info.Name!=“测试”) 返回true; 其他的 返回false; } } 我的想法是,人

我想在我的一个类中提供一种过滤某些元素的方法。为了使我的界面尽可能干净和自解释,我希望我的过滤器属性是一个
谓词

下面是一个简单的例子:

公共类ObjectAdapter
{
公共对象适配器()
{
MemberFilter=DefaultFilter;
}
公共谓词MemberFilter{get;set;}
公共虚拟bool DefaultFilter(PropertyInfo信息)
{
如果(info.Name!=“测试”)
返回true;
其他的
返回false;
}
}
我的想法是,人们可以轻松地将
MemberFilter
设置为他们想要的任何值,因此不需要创建一个继承自我的类并重写
DefaultFilter
函数的类

问题:

在我的
对象适配器中
,如果我尝试

something.GetType().GetProperties().Filter(MemberFilter)
我发现了一个奇怪的编译错误:

错误:无法从“System.Predicate”转换为“System.Func”

这对我来说毫无意义,因为
MemberFilter
基本上是一个
委托布尔谓词(PropertyInfo obj)
,它应该与
Func
相同,对吗?

问题是,对于相同类型的
T
谓词和
Func
具有相同的签名,它们仍然是不同的(因此不兼容)委托类型。这个问题可以通过使用
Func
而不是
Predicate
来解决,因为无法在它们之间直接转换。

您希望使用
Func
Where
,因为您无法将
Predicate
自动转换为
Func

另一种选择是从
谓词
中创建
Func

公共类ObjectAdapter
{
公共对象适配器()
{
MemberFilter=DefaultFilter;
}
公共谓词MemberFilter{get;set;}
公共虚拟bool DefaultFilter(PropertyInfo信息)
{
如果(info.Name!=“测试”)
返回true;
其他的
返回false;
}
}

var oa=newObjectAdapter();
Func Func=新函数(oa.MemberFilter);
var props=something.GetType().GetProperties().Where(func);

好的,但是为什么编译器能够将
公共虚拟布尔过滤器(PropertyInfo)
转换为
函数
。如果我将
DefaultFilter
而不是
MemberFilter
放在那里,它就可以正常工作。对我来说更奇怪的是,它成功地将
过滤器(PropertyInfo)
强制转换为
谓词
,但却无法将
谓词
强制转换为
Func
@florianseginger,这是因为方法组确实有转换。在引擎盖下,您将看到它分别显式地执行类似于
newpredicate(DefaultFilter)
newfunc(DefaultFilter)
的操作。委托类型之间没有转换,但方法组不是委托(目前):)这是因为
公共虚拟bool筛选器(PropertyInfo)
可以在所需签名匹配时同时分配给
谓词
Func
;然而,
Func
不能直接分配给
谓词
。当我第一次看到它的时候,我也觉得很困惑。
public class ObjectAdapter
{
    public ObjectAdapter()
    {
        MemberFilter = DefaultFilter;
    }

    public Func<PropertyInfo, bool> MemberFilter { get; set; }

    public virtual bool DefaultFilter(PropertyInfo info)
    {
        if (info.Name != "Test")
            return true;
        else
            return false;
    }
}
var oa = new ObjectAdapter();
var props= something.GetType().GetProperties().Where(oa.MemberFilter);
public class ObjectAdapter
{
    public ObjectAdapter()
    {
        MemberFilter = DefaultFilter;
    }

    public Predicate<PropertyInfo> MemberFilter { get; set; }

    public virtual bool DefaultFilter(PropertyInfo info)
    {
        if (info.Name != "Test")
            return true;
        else
            return false;
    }
}
var oa = new ObjectAdapter();
Func<PropertyInfo, bool> func = new Func<PropertyInfo,bool>(oa.MemberFilter);
var props = something.GetType().GetProperties().Where(func);