LINQ - 使用谓词<t>调用过滤器

时间:2015-10-21 08:57:17

标签: c# linq

我想在我的一个课程中提供一种过滤某些元素的方法。为了使我的界面尽可能干净和不言自明,我希望我的过滤属性为<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)相同,对吗?

2 个答案:

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