Получить имя свойства, передав его методу - PullRequest
4 голосов
/ 13 ноября 2008

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

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

Примерно так:


    RegisterMethod(p => p.Name)

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

Спасибо.

Ответы [ 2 ]

7 голосов
/ 13 ноября 2008

Я разместил полный пример этого здесь (см. Также пост о "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()); 
6 голосов
/ 13 ноября 2008

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

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;

    // ...
}
...