如何为List <string>和Expression <func <t,bool >>创建MemberExpression

时间:2018-10-04 07:49:32

标签: c# linq expression-trees

以下是我的代码以获取DeadLetterErrors,这有助于为列表过滤提供Expression<Func<T,bool>>,现在,我需要按如下方式创建Func<T,bool>(在代码中):

MemberExpression

MemberExpression memberExpressionColumn = Expression.Property(parameterType,"X"); 是要过滤的属性的名称,因此当我将其应用于X时,很容易用属性List<Person>替换X但是当我使用Name作为来源时,如何创建List<string>,这会导致异常

MemberExpression

1 个答案:

答案 0 :(得分:1)

据我了解,您需要获得如下结果:

var result = nameList.Where(obj => personNameHashset.Contains(obj));

由于您无需从字符串中获取Name属性,因此不应该使用memberExpressionColumn,而可以使用containsMethodInfo来调用ParameterExpression parameterType。您可以简化方法来像这样获得Expression<Func<T, bool>>

public static Expression<Func<T, bool>> EqualExpression<T>(this HashSet<string> nameHashSet)
{
    ParameterExpression parameterType = Expression.Parameter(typeof(T), "obj");
    var containsMethodInfo = typeof(StringListExtensions).GetMethod("Contains", new[] { typeof(string), typeof(HashSet<string>) });
    ConstantExpression constant = Expression.Constant(nameHashSet, typeof(HashSet<string>));
    var resultExpression = Expression.Call(null, containsMethodInfo, parameterType, constant);
    return Expression.Lambda<Func<T, bool>>(resultExpression, parameterType);
}

并调用它:

var finalExpression = personNameHashset.EqualExpression<string>();
var finalFunc = finalExpression.Compile();
var result = nameList.Where(finalFunc);