16

だから私は最近、式ツリーを動的に構築して遊んでいて、この方法に出くわしました。これはちょっと奇妙に思えます。の行に沿ってコードを絶えず書いた後、最初は「ああ、これはまさに私が必要としているものだ」と思いました。

var left = member is FieldInfo ? Expression.Field(instance, (FieldInfo)member) : Expression.Property(instance, (PropertyInfo)member);
var right = ...
var assign = Expression.Assign(left, right);

はい、呼び出しがあることは知っていExpression.PropertyOrField()ますが、リフレクションに戻って名前でメンバーを検索します。通常は既にMemberInfoインスタンスがあります。

とにかく、私にExpression.Bind()は役立つと思いましたが、それは私が本当に理解していないことをします. 次のコードがあるとします。

void Main()
{
    var m = typeof(Foo).GetField("Bar");
    Expression.Bind(m, Expression.Constant("")).Dump();
}

public class Foo
{
    public string Bar;
}

MemberAssignment表現を生み出しますBar = ""。しかし、インスタンスも静的参照もありません。この式を と のインスタンスにどのように適用しますFooか? この方法が使用されている例は見つかりません。

4

1 に答える 1

15

オブジェクト初期化式

あなたが持っていたとしましょう:

public class Foo
{
    public int Property { get; set; }
}

次に、次のことができます。

var parameter = Expression.Parameter(typeof(int), "i");
var newExpr = Expression.New(typeof(Foo));
var bindExprs = new[]
    {
        Expression.Bind(typeof(Foo).GetProperty("Property"), parameter)
        // You can bind more properties here if you like.
    };

var body = Expression.MemberInit(newExpr, bindExprs);
var lambda = Expression.Lambda<Func<int, Foo>>(body, parameter);

これは次のようなものです:

i => new Foo { Property = i } 

年:

あなたが解決しようと決心している「パフォーマンスの問題」を解決する手助けはできません (Expression.PropertyOrField を使用すると、本当にアプリケーションにボトルネックが発生しますか?私はやや懐疑的です。時期尚早に最適化する前にこれを決定する必要があります) (編集:お詫びこれはパフォーマンスの最適化であると誤って想定しており、自分でわかったように、Expression.MakeMemberAccess が必要なものです) Expression.Bind

于 2013-03-08T16:09:12.573 に答える