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.
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. –
Odnośnie braku używania 'PropertyOrField': to nie jest tak naprawdę optymalizacja. Bardziej jak dla mojego własnego zdrowia psychicznego. –
Ach, jeśli tak, to dlaczego nie napisać małego helpera, który bierze "MemberInfo" i odpowiednie gałęzie? – Ani