4

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

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

像这样的东西:


    RegisterMethod(p => p.Name)

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

谢谢。

4

2 回答 2

7

我在这里发布了一个完整的示例(另请参阅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()); 
于 2008-11-13T09:45:15.420 回答
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;

    // ...
}
于 2008-11-13T09:39:32.000 回答