我想在我的一个课程中提供一种过滤某些元素的方法。为了使我的界面尽可能干净和不言自明,我希望我的过滤属性为<div id="wrapper">
<div id="firstDiv">
Content to be below in this situation
</div>
<div id="secondDiv">
Content to be above in this situation
</div>
</div>
。
这是我班上的一个简单例子:
Predicate<T>
我的想法是,人们可以轻松地将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;
}
}
设置为他们想要的任何内容,因此不需要创建一个继承自我的类并覆盖MemberFilter
函数。
问题:
在DefaultFilter
内,如果我尝试
ObjectAdapter
我得到了这个奇怪的编译错误:
something.GetType().GetProperties().Filter(MemberFilter)
这对我没用,因为Error: cannot convert from 'System.Predicate<System.Reflection.PropertyInfo>' to 'System.Func<System.Reflection.PropertyInfo,bool>'
基本上是MemberFilter
,它应该与delegate bool Predicate<PropertyInfo>(PropertyInfo obj)
相同,对吗?
答案 0 :(得分:2)
问题是,虽然同一类型Predicate<T>
的{{1}}和Func<T,bool>
具有相同的签名,但它们仍然是不同的(因此也是不兼容的)委托类型。使用T
代替Func<T,bool>
可以解决问题,因为无法直接在它们之间进行转换。
答案 1 :(得分:2)
您希望使用Func<PropertyInfo, bool>
和Where
,因为您无法将Predicate<PropertyInfo>
自动投射到Func<PropertyInfo, bool>
中:
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);
另一种选择是在Func<PropertyInfo, bool>
中创建Predicate<PropertyInfo>
:
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);