12

ジェネリック型のインスタンスとプロパティ名を文字列形式で受け取り、式ツリーを返すジェネリックメソッドを作成する必要があります

単純なラムダ式を変換する必要があります

a => a.SomePropertyName

ここで、は名前でプロパティを持つaジェネリック型ですSomePropertyName

次のリフレクションコードを使用してプロパティ情報を取得できることを知っています

System.Reflection.PropertyInfo propInfo = a.GetType().GetProperty("SomePropertyName");

これは非常に単純かもしれませんが、私は式ツリーに精通していません。同様の質問がある場合は、リンクしてこれを閉じてください

4

2 に答える 2

9

パラメータタイプとリターンタイプが事前にわからないと仮定すると、いくつかを使用する必要があるかもしれませんがobject、基本的にこれは次のとおりです。

var p = Expression.Parameter(typeof(object));
var expr = Expression.Lambda<Func<object, object>>(
    Expression.Convert(
        Expression.PropertyOrField(
             Expression.Convert(p, a.GetType()), propName), typeof(object)), p);

入力タイプと出力タイプがわかっている場合は、Func<,>パラメーターを微調整し、場合によってはを削除できますExpression.Convert。極端な場合、ラムダのシグネチャを知らなくても、次の方法でラムダを取得できます。

var p = Expression.Parameter(a.GetType());
var expr = Expression.Lambda(Expression.PropertyOrField(p, propName), p);
于 2013-01-24T11:51:31.043 に答える
4

あなたはこれを使うことができます:

var p = Expression.Parameter(a.GetType(), "x");
var body = Expression.Property(p, "SomePropertyName");

Expression.Lambda(body, p);
于 2013-01-24T11:51:39.097 に答える