Получить универсальный метод "Содержит" с помощью IgonreCase при создании динамического выражения LambdaExression
Я хочу создать динамический лямбда - выражения для вызова Способ Содержит в списке строковых значений, ниже штрафа работы кода, но не игнорировали строки с учетом регистра
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 Пожалуйста, помогите, как получить Contains с IEqualityComparer с правильным использованием отражения.
2 ответа
Чтобы найти метод "Содержит" с 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 });
Чтобы вызвать метод с помощью StringComparison, просто используйте
var property = "NameOfYourProperty"
var parameter = Expression.Parameter(typeof(T), "t");
var member = Expression.Property(parameter, property);
var method = typeof(string)
.GetMethod("Contains",
new[] { typeof(string), typeof(StringComparison) });
Затем создайте свои константы
var textConstant = Expression.Constant(searchText, typeof(string));
var ignoreCaseConst = Expression.Constant(StringComparison.OrdinalIgnoreCase,
typeof(StringComparison));
И позвони
var call = Expression.Call(member, method, textConstant, ignoreCaseConst);