2013-03-08 14 views
14

Tak więc bawiłem się dynamicznie budując drzewa ekspresji i natknąłem się na tę metodę, co wydaje się trochę dziwne. Na początku myślałem „och fajne to jest dokładnie to, czego potrzebuję” po stale pisania kodu wzdłuż liniiExpression.Bind() - co on właściwie robi?

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

Tak, wiem, że jest Expression.PropertyOrField() wezwanie, ale robi podroż dookoła z powrotem do refleksji, aby znaleźć element według nazwy , gdzie jak zwykle mam już instancję MemberInfo.

Tak czy inaczej, myślałem, że Expression.Bind() byłby mi przydatny, ale robi coś, czego tak naprawdę nie rozumiem. Biorąc pod uwagę następujący kod:

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

public class Foo 
{ 
    public string Bar; 
} 

produkuje MemberAssignment wyraz Bar = "". Ale nie ma żadnej instancji ani odniesienia statycznego. W jaki sposób mogę zastosować to wyrażenie i instancja Foo? Nie mogę znaleźć żadnego przykładu użycia tej metody.

Odpowiedz

14

Wyrażenia inicjalizujące obiekty.

Powiedzmy, że miałem:

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

Następnie można zrobić:

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

który jest czymś w rodzaju:

i => new Foo { Property = i } 

Stary:

mogę” t ci pomóc olve "problem wydajności" jesteś zdeterminowany, aby rozwiązać (przy użyciu Expression.PropertyOrField naprawdę wprowadzić wąskie gardło w aplikacji? Jestem nieco sceptyczny. Powinieneś to ustalić przed optymalizacją przedwcześnie). (EDIT: Przepraszam za błędne założenie, że była to optymalizacja pod względem perfekcji, a jak sam się dowiedziałeś, Expression.MakeMemberAccess jest tym, czego potrzebujesz), ale mogę może powiedzieć Ci do czego przydatne jest Expression.Bind.

+2

oooh ... Myślałem, że to właśnie to, ale oczekiwałem przeładowania 'Expression.New()', aby to zaakceptować. Nie przyszło mi do głowy, że może to być zupełnie inne wezwanie. –

+0

Odnośnie braku używania 'PropertyOrField': to nie jest tak naprawdę optymalizacja. Bardziej jak dla mojego własnego zdrowia psychicznego. –

+0

Ach, jeśli tak, to dlaczego nie napisać małego helpera, który bierze "MemberInfo" i odpowiednie gałęzie? – Ani