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);