Как получить имя свойства из Func<T, string>
?
Есть метод void Example(Func<MyClass, string> func) { ... }
Обращаюсь к методу MyMethod(x=> x.MyProperty)
MyClass:
public class MyClass
{
public string MyProperty { get; set; }
}
Что то не могу найти нигде ответа или примера(везде примеры с Expression<func<t,string>>
..
Никак. Тут нужно понимать матчать, как это всё устроено.
Делегат - это просто метод (указатель на метод), который что-то принимает и что-то возвращает (в частном случае - void), вы можете как написать:
Example(x => x.MyProperty);
Или в классе оформить явно делегат:
delegate string Operation(MyClass source);
И использовать запись:
Func<MyClass, string> operation = x => x.MyProperty;
Example(operation);
В делегате больше ничего и нет внутри, не хранится ничего кроме указателя на метод:
Совсем другое дело — дерево выражений. В нём как раз хранится информация о
Expression<Func<MyClass, string>> expr = x => x.MyProperty;
Example2(expr);
Example2(x => x.MyProperty);
public void Example2(Expression<Func<MyClass, string>> expr)
{
}
И можно разобрать выражение, получив доступ к узлам.
Поэтому то, что для вас выглядит внешне одинаково x => x.MyProperty
для компилятора является совсем разными вещами: в одном случае может сделать разбор и компилируется в разбираемые вещи, в другом — компилируется в другие вещи, в которых не сохраняется информация.
В качестве примера (1, 2, 3) могу привести конструируемые на клиенте выражения, которые потом на сервере заново разбираются и компилируются в SQL-выражения, чтобы был не IEnumerable, выполняемый на клиенте, а был IQueryable, выполняемый на сервере. Они все построены на базе Expression, там нигде не может быть просто Func.
Поэтому и вам не попадается таких примеров, сколько вы не ищете.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Можно ли задать геттер статичным,но при этом сеттер приватным/публичным? И для чего нужны статичные геттеры и сеттеры?
Проблема возникает при компиляцииУ меня 3 действия, если пользователь ввёл не число, а буквы, то программа должна выводить "Пожалуйста, выбирайте...
Доброго времени сутокУ меня есть такой скрипт управления объектом и есть скрипт коллизии
Пытаюсь разобраться в том, как работают лямбда-функции и увидел на метаните, как он проделывает следующее: