Biscuits пишет о селекторах свойств (или полей) ... Для этого есть два вида использования: один (тот, о котором он говорил), чтобы получить имя поля/свойства.
Как это сделать?
Дано:
Expression<Func<Foo, int>> expression = x => x.Something;
Вы делаете:
string name = ((MemberExpression)expression.Body).Member.Name;
, как пишут другие, в C# 6.0 это будет почти бесполезным благодаря nameof()
(что в целом быстрее, потому что это делается во время компиляции а во время выполнения), а в C# 5.0 частично бесполезно благодаря [CallerMemberName]
.
Второе использование заключается в том, что путем передачи Expression<>
, который является «получателем» (функция, которая дала объект, возвращает значение чего-либо), метод может «построить» «сеттер».
Func<Foo, int> getter = expression.Compile();
var parameter = Expression.Parameter(expression.ReturnType);
Action<Foo, int> setter = Expression.Lambda<Action<Foo, int>>(
Expression.Assign(expression.Body, parameter),
new[] { expression.Parameters[0], parameter }).Compile();
Foo foo = new Foo();
setter(foo, 5); // Example of use of the setter
int value = getter(foo); // Example of use of the getter
Если вы должны использовать один временный сеттер, это довольно медленнее, чем непосредственно отражение (потому что Expression
s должен быть построен, а затем компилируются и так далее, а также в строительстве и компиляции (но а не при использовании) Expression
есть отражение). Но если вам нужно использовать много раз геттер/сеттер, то он становится быстрее (если вы их «кешируете»), потому что использование построенного таким образом геттера/сеттера почти так же быстро, как прямой доступ к свойству/поле (медленная часть заключается в создании геттера/сеттера)
Требуется добавить, что типы полей и свойств не были int, как в примере выше, они были настраиваемыми типами. – Liger86
Действительно ли код действительно компилируется? вы назначаете анонимную функцию переменной типа int? Это кажется невозможным. –
Вышеприведенный код служит только для иллюстрации того, что я видел лямбда, назначенное для поля, и что это чуждо мне. – Liger86