[c#]创建谓词生成器 (=> listOfInts.Contains(x.ListOfIntsToCheck)) x

标签: Linq C#
发布时间: 2017/2/28 23:20:26
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我 trtying 打造谓词的生成器,它返回一个谓词,检查是否整数列表中包含另一个整数列表中。至今为止我还这

public static Expression<Func<T, bool>> DynamicIntContains<T, TProperty>(string property, IEnumerable<TProperty> items)
{
    var pe = Expression.Parameter(typeof(T));
    var me = Expression.Property(pe, property);
    var ce = Expression.Constant(items);
    var call = Expression.Call(typeof(List<int>), typeof(List<int>).GetMethod("Contains").Name, new[] { typeof(int) }, ce, me);
    return Expression.Lambda<Func<T, bool>>(call, pe);
}

T 是包含一个 Id 列表作为它的属性之一的搜索对象。TProperty 是一个整数的列表和属性是名称上的属性的列表。我得到的错误是

Additional information: No method 'Contains' exists on type 'System.Collections.Generic.List`1[System.Int32]'.

这是因为我称它为从静态的方法吗?或我在试图访问 typeof(List) 的方法不正确?谢谢你。

解决方法 1:

这里有解决方案;

    public static Expression<Func<T, bool>> DynamicIntContains<T, TProperty>(string property, IEnumerable<TProperty> items, object source, PropertyInfo propertyInfo)
    {
        var pe = Expression.Parameter(typeof(T));
        var me = Expression.Property(pe, property.Singularise());
        var ce = Expression.Constant(propertyInfo.GetValue(source, null), typeof(List<int>));
        var convertExpression = Expression.Convert(me, typeof(int));
        var call = Expression.Call(ce, "Contains", new Type[] { }, convertExpression);
        return Expression.Lambda<Func<T, bool>>(call, pe);
    }

这发泄的假设的列表名称是它的成员的复数形式。在 Expression.Call 路过 typeof(List),正确的方法是通过在类型 []。这似乎也是要求将 MemberExpression 转换为特定类型的常量。谢谢你。

赞助商