gpt4 book ai didi

c# - 如何为 List、Expression> 创建 MemberExpression

转载 作者:行者123 更新时间:2023-11-30 17:28:35 25 4
gpt4 key购买 nike

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

 MemberExpression memberExpressionColumn = Expression.Property(parameterType,"X");

在哪里X是用于过滤的属性名称,所以当我在 List<Person> 上应用它时, 很容易替换 X有属性(property)Name , 但是当我使用 List<string>作为源,那么如何创建MemberExpression ,这会导致异常

void Main()
{
List<Person> personList = new List<Person>()
{
new Person{ Name = "Shekhar", Age = 31},
new Person{ Name = "Sandip", Age = 32},
new Person{ Name = "Pramod", Age = 32},
new Person{ Name = "Kunal", Age = 33}
};


var personNameList = personList.Select(p => p.Name).ToList();

var personNameHashset = new HashSet<string>(personNameList);

var nameList = new List<string>() { "Kunal", "Pramod", "Mrinal" };

var finalExpression = personNameHashset.EqualExpression<string>("Name");

var finalFunc = finalExpression.Compile();

var result = nameList.Where(finalFunc);

result.Dump();
}

public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}

public static class ExpressionTreesExtension
{
public static Expression<Func<T, bool>> EqualExpression<T>(this HashSet<string> nameHashSet, string columnName)
{
var expressionList = new List<Expression>();

ParameterExpression parameterType = Expression.Parameter(typeof(T), "obj");

// Exception Here - How to create MemberExpression for primitive type list List<string>

MemberExpression memberExpressionColumn = Expression.Property(parameterType,columnName);

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, memberExpressionColumn, constant);

return Expression.Lambda<Func<T, bool>>(resultExpression, parameterType);
}
}

public static class StringListExtensions
{
/// <summary>
/// String Extension - Contains (Substring)
/// </summary>
/// <param name="source"></param>
/// <param name="subString"></param>
/// <returns></returns>
public static bool Contains(this string name, HashSet<string> nameHashSet)
{
return nameHashSet.Contains(name);
}
}

最佳答案

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

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

因为你不需要得到 Name不应使用的字符串中的属性 memberExpressionColumn你可以调用containsMethodInfoParameterExpression 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);

关于c# - 如何为 List<string>、Expression<Func<T,bool>> 创建 MemberExpression,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52641636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com