Так что я не совсем понимаю это. Я пытаюсь создать MethodCallExpression, но я получаю ошибку времени выполнения, заявляя, что метод не может быть вызван именно с тем типом, который он ожидает? Я довольно новичок в деревьях выражений, поэтому я уверен, что у меня есть что-то в обратном направлении, но почти каждый пример, который я пытаюсь адаптировать, приводит к этому.Не удается вызвать метод типа A с параметром A?
using System;
using System.Linq;
using System.Linq.Expressions;
namespace ConsoleApplication4
{
class Program
{
static void Main(string[] args)
{
var helper = new Helper();
var expr = helper.GetMatchExpr<TestClass>(t => t.Name, "foo");
}
}
public class Helper
{
public Expression<Func<T, bool>> GetMatchExpr<T>(Expression<Func<T, object>> member, string searchValue)
{
var memberExpr = member.Body as MemberExpression;
if (memberExpr == null)
throw new ArgumentException("Expected member expression");
var parameter = Expression.Parameter(typeof(T), "type");
var property = Expression.Property(parameter, memberExpr.Member.Name);
var propertyExpr = Expression.Convert(property, typeof(string));
var matchMethod = typeof(Helper).GetMethod("IsMatch", new[] { typeof(object), typeof(string) });
var valueExpr = Expression.Constant(searchValue, typeof(string));
var matchExpr = Expression.Call(property, matchMethod, propertyExpr, valueExpr); // throws exception
return Expression.Lambda<Func<T, bool>>(matchExpr, parameter);
}
public bool IsMatch(object input, string searchValue)
{
if (input == null)
return true;
var qWords = GetWords(searchValue);
var pWords = GetWords(input.ToString());
return (
from qWord in qWords
from pWord in pWords
where qWord.Equals(pWord, StringComparison.OrdinalIgnoreCase)
select qWord).Any();
}
public string[] GetWords(string input)
{
return string.IsNullOrEmpty(input)
? new string[0]
: input.Split(' ');
}
}
public class TestClass
{
public string Name { get; set; }
public string Age { get; set; }
}
}
Исключение составляет
Дополнительная информация: Метод 'Логическое IsMatch (System.Object)' объявили о типе 'ConsoleApplication4.Helper`1 [ConsoleApplication4.TestClass]' не может быть названо с экземпляром типа 'System.Object'
Чтобы ответить на некоторые вопросы:
Как упражнение, я пытаюсь создать этот класс, где вы можете указать коллекцию свойств объекта T, которая будет включена в поиск. Итак, как только все эти свойства установлены, вы вызываете Apply (...) и выполняете итерацию через набор выражений членов, захватываете их значение, разделяете на отдельные слова, делаете то же самое с фразой запроса и затем возвращаете любой объект который имеет любые свойства, которые соответствуют любому из слов.
Я прошел через, вероятно, 5 или 6 различных примеров, которые были близки к тому, что я пытался достичь, и это просто то, что я сейчас нахожу.
Так что, я думаю, я не совсем понимаю, что «вызывать IsMatch по результату propertyExpr». Означает ли это, что он использует результат, например result.IsMatch или IsMatch (результат)? Если это последний, нельзя ли использовать что-либо в качестве объекта?
«Я получаю ошибку времени выполнения, заявляя, что метод не может быть вызван именно таким типом, который он ожидает» - нет, вы получаете исключение, заявив, что вы не можете вызвать «Помощник .IsMatch' на экземпляре 'System.Object'. Это не поможет, что вы не предоставили [mcve], поэтому мы не можем воспроизвести проблему. –
Обновлено. Так что, очевидно, меня смущают требуемые параметры. – Sinaesthetic
Это все еще не является полным, поскольку в него не входит PredicateBuilder, и это излишне подробный - почему есть класс 'Main', который вы просто создаете и запускаете в своем классе' Program', например?Я сильно подозреваю, что вы можете получить это от неполного примера из 122 строк до полного примера на основе 75 строк. –