c# - 创建动态 LambdaExression 时使用 IgonreCase 获取通用方法“包含”
问题描述
我想为方法调用创建动态 Lambda 表达式,包含字符串值列表,下面的代码工作正常但不忽略字符串区分大小写
ParameterExpression parameter = Expression.Parameter(typeof(E), "x");
IQueryable<E> itemsToFilter = null; //this parameter set from input parameters
parameterName = "Name"; //this parameter set from input parameters
var prop = typeof(E).GetProperty(parameterName, BindingFlags.SetProperty | BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
MemberExpression propertyExp=Expression.Property(param, parameterName);
var genericListType = typeof(List<>).MakeGenericType(typeof(string));
IList tmplist = (IList)Activator.CreateInstance(genericListType);
foreach (var obj in orcond.Values)
{
tmplist.Add(obj);
}
methodin = tmplist.GetType().GetMethod("Contains");
var list = Expression.Constant(tmplist);
var containsMethodExpin = Expression.Call(list, methodin, propertyExp);
comparison = Expression.Lambda<Func<E, bool>>(containsMethodExpin, parameter)
itemsToFilter.Where(comparison);
请注意,上述代码仅适用于实体框架 IQueryable,但不适用于 C# List
然后我想将列表中的字符串与 IgnoreCase 进行比较
我想打电话Contains
,StringComparer.OrdinalIgnoreCase
但当我使用
methodin = typeof(List<string>).GetMethod("Contains", new Type[] { typeof(string), typeof(IEqualityComparer<string>) });
'methodin' 返回 null 请帮助如何使用正确的反射使用IEqualityComparer获取包含。
解决方案
要使用参数查找“包含”方法EqualityComparer
,您可以执行以下操作:
MethodInfo Method = null;
foreach (var m in typeof(Enumerable).GetMethods())
{
if (m.Name == "Contains" && m.GetParameters().Length == 3)
{
Method = m.MakeGenericMethod(typeof(string));
}
}
然后你可以像这样使用它:
var l = new List<string>() { "a", "b" };
var Result = (bool)Method.Invoke(null, new object[] { l, "a", EqualityComparer<string>.Default });
推荐阅读
- swift - 在 Swift 4 中使用 Twilio 发送消息
- java - 如何在 VSCode 中获取 Java 抽象语法树?
- javascript - Angular 2路由到具有不同url的相同组件
- css - 无论方向如何,如何在 CSS/Bootstrap 中水平堆叠/对齐图像?
- c++ - 在 POS 应用程序中使用 CCO 实现和使用 MSR 服务层
- sql-server - Microsoft SQL Server 2016 - 从哪里获得安装介质?
- python - 即使我明确使用 \r\n,Python 仍会继续编写 unix 样式的换行符
- javascript - 为什么 clearInterval 在我的 discord bot 脚本中不起作用
- mongodb - 使用 Node-Red 将消息异步发送到 MongoDB
- oracle - 将 2 列添加到 oracle 中的现有表中,不为空,并将这些列设置为 PK