使用IgonreCase创建动态LambdaExression时获取方法“包含”的问题

我想为方法调用包含创建动态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 获取包含,并正确使用反射。

shixinzhijia 回答:使用IgonreCase创建动态LambdaExression时获取方法“包含”的问题

要使用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 });
本文链接:https://www.f2er.com/2884382.html

大家都在问