#c# #expression
Вопрос:
Возникли ошибки при построении этого.
Система.Метод исключения аргумента Func<строка,bool> Compile (), объявленный в выражении типа<строка,bool><Функция<строка,bool><строка, bool>> не может быть вызван с экземпляром функции<строка,bool>><строка, bool>
//How to create this through Expression API
Func<List<string>, string, bool> containsAny = (list,text) => list.Any(item => item.Contains(text));
MethodInfo methodInfoContains = typeof(string).GetMethod("Contains", new Type[] { typeof(string) });
MethodInfo methodInfoAny = typeof(Enumerable)
.GetMethods()
.Where(x => x.Name == "Any" amp;amp; x.GetParameters().Count() == 2)
.First()
.MakeGenericMethod(typeof(string));
//text
ParameterExpression parameterExpressionText = Expression.Parameter(typeof(string), "text");
//item
ParameterExpression parameterExpressionItem = Expression.Parameter(typeof(string), "item");
//item.Contains(text)
MethodCallExpression methodCallExpressionContains = Expression.Call(parameterExpressionItem, methodInfoContains, parameterExpressionText);
// item => item.contains(text)
Expression<Func<string, bool>> containsLambda = Expression.Lambda<Func<string, bool>>(methodCallExpressionContains, parameterExpressionItem);
//I cant call containsLambda.Compile() as text is unknown at this time
MethodInfo methodInfoCompile = containsLambda.GetType().GetMethod("Compile", Type.EmptyTypes);
//(item => item.contains(text)).Compile()
MethodCallExpression compileMethodCall = Expression.Call(containsLambda, methodInfoCompile); //ERROR
//list
ParameterExpression parameterExpressionList = Expression.Parameter(typeof(List<string>), "list");
//list.Any(item => item.Contains(text))
MethodCallExpression methodCallExpressionAny = Expression.Call(methodInfoAny, parameterExpressionList, compileMethodCall);
var finalLambda = Expression.Lambda<Func<List<string>, string, bool>>(methodCallExpressionAny, parameterExpressionList, parameterExpressionText);
List<string> dummyList = new List<string>() { "one" };
System.Console.WriteLine(finalLambda.Compile()(dummyList, "one"));