Получить имя свойства в Func C#

135
12 февраля 2022, 02:00

Как получить имя свойства из 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>>..

Answer 1

Никак. Тут нужно понимать матчать, как это всё устроено.

Делегат - это просто метод (указатель на метод), который что-то принимает и что-то возвращает (в частном случае - 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.

Поэтому и вам не попадается таких примеров, сколько вы не ищете.

READ ALSO
Может ли геттер и сеттер быть статичным?

Может ли геттер и сеттер быть статичным?

Можно ли задать геттер статичным,но при этом сеттер приватным/публичным? И для чего нужны статичные геттеры и сеттеры?

85
System.FormatException: &quot;Input string was not in a correct format.&quot;

System.FormatException: "Input string was not in a correct format."

Проблема возникает при компиляцииУ меня 3 действия, если пользователь ввёл не число, а буквы, то программа должна выводить "Пожалуйста, выбирайте...

150
Возвращение значения переменной C#

Возвращение значения переменной C#

Доброго времени сутокУ меня есть такой скрипт управления объектом и есть скрипт коллизии

102
Как работают лямбда-функции?

Как работают лямбда-функции?

Пытаюсь разобраться в том, как работают лямбда-функции и увидел на метаните, как он проделывает следующее:

103