Expression.Bind () - was macht es eigentlich?

.net c# expression expression-trees reflection

Frage

Also habe ich in letzter Zeit mit dem dynamischen Erstellen von Expression-Bäumen gespielt und bin auf diese Methode gestoßen, die irgendwie merkwürdig wirkt. Zuerst dachte ich "Oh, cool, das ist genau das, was ich brauche", nachdem ich ständig Code in der Art geschrieben habe

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

Ja, ich weiß, dass es einen Aufruf von Expression.PropertyOrField() , aber es wird auf die Reflektion zurückgegangen, um Member nach Name zu finden, wobei ich normalerweise die MemberInfo Instanz habe.

Wie auch immer, ich dachte, Expression.Bind() wäre für mich nützlich, aber es tut etwas, was ich nicht wirklich verstehe. Gegeben der folgende Code:

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

public class Foo
{
    public string Bar;
}

es erzeugt MemberAssignment Ausdruck Bar = "" . Aber es gibt keine Instanz und keine statische Referenz. Wie würde ich diesen Ausdruck jemals auf Foo anwenden? Ich kann kein Beispiel für diese Methode finden.

Akzeptierte Antwort

Objektinitialisiererausdrücke .

Sagen wir, du hattest:

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

Dann könnten Sie tun:

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);

Das ist etwas wie:

i => new Foo { Property = i } 

Alt:

Ich kann Ihnen nicht helfen, das "Leistungsproblem" zu lösen, das Sie lösen wollen (wird die Verwendung von Expression.PropertyOrField wirklich einen Engpass in Ihrer Anwendung einführen? Ich bin etwas skeptisch. Sie sollten dies vor einer frühzeitigen Optimierung feststellen) ( EDIT : Apologies for falsch angenommen, dass dies eine Perf Optimierung war, und wie Sie selbst herausgefunden haben, ist Expression.MakeMemberAccess, was Sie brauchen), aber ich kann Ihnen sagen, was Expression.Bind nützlich ist.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum