2008-11-13 6 views
4

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

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

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


    RegisterMethod(p => p.Name) 

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

Спасибо.

ответ

6

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

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; 

    // ... 
} 
+0

Почему нужен TProp? Я тестировал, и он работает, но я понимаю, что мне нужно изучить деревья выражений. – 2008-11-13 10:02:31

+0

@Vasi - тип лямбда должен быть явным. Вы не можете, например, просто использовать `Expression`. TProp здесь относится к «int» и т. Д., Который описывает свойство. Однако вы можете позволить компилятору понять это. – 2008-11-13 10:06:18

7

Я опубликовал полный пример этого here (см также пост о «this» под ним)

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

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

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

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