获取属性名称的扩展方法

时间:2015-09-03 13:04:41

标签: c# reflection extension-methods propertyinfo

我有一个扩展方法,可以将属性名称设为

public static string Name<T>(this Expression<Func<T>> expression)
{
    MemberExpression body = (MemberExpression)expression.Body;
    return body.Member.Name;
}

我称之为

string Name = ((Expression<Func<DateTime>>)(() => this.PublishDateTime)).Name();

这样可以正常工作,并以字符串形式返回PublishDateTime

但是我的调用语句有问题,看起来太复杂了,我想要这样的东西。

this.PublishDateTime.Name()

有人可以修改我的扩展方法吗?

3 个答案:

答案 0 :(得分:11)

试试这个:

public static string Name<T,TProp>(this T o, Expression<Func<T,TProp>> propertySelector)
{
    MemberExpression body = (MemberExpression)propertySelector.Body;
    return body.Member.Name;
}

用法是:

this.Name(x=>x.PublishDateTime);

答案 1 :(得分:10)

使用C#6.0,您可以使用:

nameof(PublishDateTime)

答案 2 :(得分:2)

您无法执行this.PublishDateTime.Name(),因为传递给扩展方法的唯一内容是您调用扩展方法的值或引用。

无论是属性,字段,局部变量还是方法结果无关紧要,它都没有可以在扩展方法中访问的名称。

表达式将是“详细”,请参阅 How can I add this method as an extension method to properties of my class?(感谢@Black0ut)将它放在一个静态助手类中。