【问题标题】:Extension method to get property name获取属性名称的扩展方法
【发布时间】:2015-09-03 13:04:40
【问题描述】:

我有一个扩展方法来获取属性名称

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()

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

【问题讨论】:

标签: c# reflection extension-methods propertyinfo


【解决方案1】:

试试这个:

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);

【讨论】:

  • 非常好,它解决了我的问题。时尚通话this.Name(x=&gt;x.PublishDateTime);
  • 这需要什么最低 C# 版本或 LINQ?
【解决方案2】:

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

nameof(PublishDateTime)

【讨论】:

  • @Lali 获取 Visual Studio 2015。
  • 所以我需要等待这个。
【解决方案3】:

你不能这样做this.PublishDateTime.Name(),因为唯一会传递给扩展方法的是你调用扩展方法的值或引用。

无论是属性、字段、局部变量还是方法结果都没有关系,它不会有一个您可以在扩展方法内部访问的名称。

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

【讨论】:

  • 为什么我不能这样做?当我调用this.PublishDateTime.Name() 时,这意味着我正在将对象传递给扩展方法。现在扩展方法应该自己创建表达式。我想修改扩展方法。必须有一些软解决方案......
  • 你可以这样做,但它不会给你会员名。扩展方法并不“知道”它是在一个成员上被调用的,也不一定是 (string foo = ""; var fooName = foo.Name())。传递给扩展方法的只是你调用它的对象的值或引用。
猜你喜欢
  • 1970-01-01
  • 2011-07-12
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 2014-10-27
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多