我希望在我的其中一个课程中提供一种过滤某些元素的方法。为了保持我的界面尽可能干净和自我解释,我想让我的过滤器属性是一个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)
,它应该与Func<PropertyInfo, bool>
相同,对吧?
public virtual bool Filter(PropertyInfo)
转换为Func<PropertyInfo, bool>
呢?如果我在那里放置DefaultFilter
而不是MemberFilter
,它也可以正常工作。对我来说更奇怪的是,它成功地将Filter(PropertyInfo)
转换为Predicate<PropertyInfo>
,但然后无法将Predicate<PropertyInfo>
转换为Func<PropertyInfo, bool>
。 - Florian Seggingernew Predicate<PropertyInfo>(DefaultFilter)
或new Func<PropertyInfo, bool>(DefaultFilter)
的操作。虽然委托类型之间没有转换,但方法组并不是委托(至少目前还不是) :) - Luaanpublic virtual bool Filter(PropertyInfo)
可以被分配给Predicate<PropertyInfo>
和Func<PropertyInfo,bool>
,因为所需的签名匹配;然而Func<PropertyInfo,bool>
不能直接分配给Predicate<PropertyInfo>
。当我第一次遇到它时,我也觉得很困惑。 - Codor