Add Contains到现有的Func <t,object =“”>属性

时间:2016-10-23 09:10:35

标签: c# linq properties where contains

我正在尝试为现有的Func属性列表创建Contains子句,但我不知道如何将它附加到以前传递的属性列表。

public static List<Func<T, bool>> GetPropertyWhereClauses<T>(List<Func<T, object>> properties, string queryPhrase)
    {
        var whereClauses = new List<Func<T, bool>>();

        foreach (var property in properties)
        {
            /// how to add Contains to existing property Func<T, object> ?
            whereClauses.Add(property.Contains(queryPhrase));
        }

        return whereClauses;
    }

如何添加?我尝试使用一些Expression.Call,但它没有将Func作为参数。

1 个答案:

答案 0 :(得分:1)

如果您只想将每个Func<T, object>转换为Func<T, bool>,如果第一个func返回对象转换为字符串包含queryPhrase,您可以这样做:

public static List<Func<T, bool>> GetPropertyWhereClauses<T>(List<Func<T, object>> funcs, string queryPhrase)
{
    var whereClauses = new List<Func<T, bool>>();
    foreach (var func in funcs)
    {
        whereClauses.Add(o => func(o).ToString().Contains(queryPhrase));
    }
    return whereClauses;
}

或者更好的LINQ:

 public static List<Func<T, bool>> GetPropertyWhereClauses<T>(List<Func<T, object>> funcs, string queryPhrase)
{
    return funcs.Select(func => new Func<T, bool>(o => func(o).ToString().Contains(queryPhrase)).ToList();
}

如果reutrn对象实际上是一个列表而不是一个字符串,你可以用类似的方式检查queryPhrase是否是列表的一部分:

public static List<Func<T, bool>> GetPropertyWhereClauses<T>(List<Func<T, object>> funcs, string queryPhrase)
{
    return funcs.Select(func => new Func<T, bool>(o => ((List<string>)func(o)).Contains(queryPhrase)).ToList();
}

如果你可以将它变成你期望的真实类型,那么让你的func返回tpye并不是最好的主意,它将为你节省所有多余的投射。