Получите имя свойства, передав его методу

У пользователя StackOverflow jolson был очень хороший фрагмент кода, который демонстрирует, как можно регистрировать методы без использования строк, но с деревьями выражений здесь.

Можно ли иметь нечто подобное для свойств вместо методов? Чтобы передать свойство (а не имя свойства) и внутри метода получить имя свойства?

Что-то вроде этого:


    RegisterMethod(p => p.Name)

    void RegisterMethod(Expression??? propertyExpression) where T : Property ???
    {
        string propName = propertyExpression.Name;
    }

Спасибо.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
765
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете написать что-нибудь по этому поводу:

static void RegisterMethod<TSelf, TProp> (Expression<Func<TSelf, TProp>> expression)
{
    var member_expression = expression.Body as MemberExpression;
    if (member_expression == null)
        return;

    var member = member_expression.Member;
    if (member.MemberType != MemberTypes.Property)
        return;

    var property = member as PropertyInfo;
    var name = property.Name;

    // ...
}

Зачем нужен TProp? Я протестировал, и это работает, но я понимаю, что мне нужно изучить деревья выражений.

Vasile Tomoiaga 13.11.2008 13:02

@Vasi - тип лямбды должен быть явным. Например, нельзя просто использовать Expression. TProp здесь относится к "int" и т. д., Описывающим свойство. Однако вы можете позволить компилятору разобраться в этом.

Marc Gravell 13.11.2008 13:06

TProp выражает возвращаемый тип свойства и необходим для описания метода, который принимает что-то и возвращает что-то еще, например: Func <TSelf, TProp>. Затем на основе этого типа делегата строится дерево выражений.

Jb Evain 13.11.2008 13:07

Я опубликовал полный пример этого здесь (см. Также сообщение о "this" под ним)

Обратите внимание, что это касается LambdaExpression и т. д. В качестве обновления опубликованного кода вы можете добавить немного больше, чтобы упростить его использование в некоторых сценариях:

static class MemberUtil<TType>
{
    public static string MemberName<TResult>(Expression<Func<TType, TResult>> member)
    {
        return MemberUtil.MemberName<TType, TResult>(member);
    }
}

Затем вы можете использовать общий вывод типа для возвращаемого значения:

string test1 = MemberUtil<Foo>.MemberName(x => x.Bar); 
string test2 = MemberUtil<Foo>.MemberName(x => x.Bloop()); 

Привет, Марк, Большое спасибо, это именно то, что я искал, чтобы как-то игнорировать тип свойства.

Vasile Tomoiaga 13.11.2008 13:40

@Vasi - дженерики - это "все или ничего", когда дело доходит до вывода типа (возможно, в какой-то момент у нас будет "бормотать" типизацию). Приведенный выше трюк позволяет компилятору определять тип свойства без необходимости указывать его самостоятельно ;-p

Marc Gravell 13.11.2008 15:55

Другие вопросы по теме