私はこれをよく理解していません。私は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; }
}
}
例外はある
追加情報: 'ConsoleApplication4.Helper`1は[ConsoleApplication4.TestClass]' を呼び出すことができないタイプ で宣言メソッド 'ブールIsMatch(System.Objectの)' :タイプのインスタンス 'のSystem.Object' で
は、いくつかの質問に答えるために
練習として、このクラスを作成して、オブジェクトTに検索に含めるプロパティのコレクションを指定できるようにしています。したがって、これらのプロパティがすべて設定されると、Apply(...)を呼び出すと、メンバー式のコレクションを反復して値を取得し、個々の単語に分割し、クエリフレーズで同じことを行い、オブジェクトを返しますいずれかの単語に一致するプロパティを持つ。
私は達成しようとしていたものに近い5つまたは6つの異なる例を見てきましたが、これは現時点での私のところです。
私は「propertyExprの結果でIsMatchを呼び出す」ことをよく理解していないと思います。それはresult.IsMatchやIsMatch(result)のような結果を使用していることを意味しますか?それが後者なら、何もオブジェクトとして使えないはずですか?あなたのメソッド呼び出し式で
"メソッドが期待通りの型で呼び出すことができないというランタイムエラーが発生しました" - いいえ、インスタンス上でヘルパー.IsMatch'を呼び出すことができないという例外が発生しています'System.Object'のあなたは[mcve]を提供していないので、問題を再現することはできません。 –
更新されました。明らかに、私は必要なパラメータによって混乱しています。 – Sinaesthetic
PredicateBuilderが含まれていないため、これはまだ完全ではなく、不必要に冗長です。なぜなら、 'Program'クラスのインスタンスを作成して実行する' Main'クラスがあるのはなぜですか?私はあなたが不完全な122行の例から完全な75行以下の例にこれを落とすことができると強く思っています。 –