通过将属性的名称传递给方法来获取属性的名称

时间:2008-11-13 09:34:12

标签: c# .net properties expression-trees

StackOverflow用户jolson有一段非常好的代码,它举例说明了如何在不使用字符串的情况下注册menthods,而是使用表达式树here

是否可以为属性而不是方法提供类似的东西?传递属性(不是属性的名称)和方法内部以获取属性名称?

这样的事情:


    RegisterMethod(p => p.Name)

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

感谢。

2 个答案:

答案 0 :(得分:7)

我发布了此here的完整示例(另请参阅下面有关“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()); 

答案 1 :(得分: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;

    // ...
}