2013-03-08 8 views
14

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 kühl das ist genau das, was ich brauche“, nachdem ständig Code entlang der Linien vonExpression.Bind() - was macht es eigentlich?

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

Schreiben Ja, ich weiß, es ist Expression.PropertyOrField() Anruf, aber es hat Folgendes zu bieten: zurück zum Reflexionselement zu finden nach Namen , wo ich normalerweise bereits MemberInfo Instanz habe.

So jedenfalls dachte ich Expression.Bind() wäre nützlich für mich, aber es tut etwas, was ich nicht wirklich verstehe. Angesichts der folgenden Code:

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

public class Foo 
{ 
    public string Bar; 
} 

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

Antwort

14

Objektinitialisiererausdrücke.

Angenommen, Sie hatten:

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 so etwas wie:

i => new Foo { Property = i } 

Alt:

Ich kann‘ t dir helfen s Das "Leistungsproblem", das Sie lösen möchten (wird mit Expression.PropertyOrField wirklich ein Engpass in Ihrer Anwendung eingeführt? Ich bin etwas skeptisch. Sie sollten dies vor der frühzeitigen Optimierung feststellen) (EDIT: Entschuldigung für die falsche Annahme, dass dies eine Perf-Optimierung war, und wie Sie selbst herausgefunden haben, Expression.MakeMemberAccess ist was Sie brauchen), aber ich kann Ihnen sagen was Expression.Bind ist nützlich für.

+2

oooh ... Ich dachte, das ist, was es ist, aber ich erwartete eine Überladung von 'Expression.New()', das zu akzeptieren. Es kam mir nicht in den Sinn, dass das ein ganz anderer Anruf sein könnte. –

+0

Wenn Sie 'PropertyOrField' nicht verwenden: das ist nicht wirklich Optimierung. Mehr wie für meine eigene Gesundheit. –

+0

Ah, wenn das der Fall ist, warum schreibe dann nicht einen kleinen Helfer, der eine 'MemberInfo' nimmt und die Zweige entsprechend verzweigt? – Ani

Verwandte Themen