【问题标题】:How to get a property name from the property of a class instance? [duplicate]如何从类实例的属性中获取属性名称? [复制]
【发布时间】:2013-06-07 13:50:43
【问题描述】:

这是我想要实现的代码:

string Name = GetPropName(myClass.SomeProperty); // returns "SomeProperty"

因为我可能要重命名我的类的属性,所以我不想忘记在我的代码中的某处更改它们的字符串名称,并且有很多地方我使用字符串名称作为属性,所以我想有这个方便的方法可以为我获取属性的当前名称作为字符串。我该怎么做?

我所追求的是一个方法,它只返回它作为参数接收的属性的字符串名称

我看到之前有人问过类似的问题,但没有答案可以很好地解释如何做我想做的事情。

【问题讨论】:

  • 你想要GetPropName(x=>x.PropName);
  • @adt 我不知道,是吗?
  • 是的,实际上链接的答案stackoverflow.com/questions/2820660/… 应该可以工作。因为你不想使用道具名称作为字符串,用表达式公开它们可能对你有用
  • @OlivierJacot-Descombes 你的答案对我不起作用 - VS 似乎找不到 ExpressionMemberExpression,即使正在使用 System.Linq 命名空间。也许这是来自旧版本的 .Net 或其他东西。

标签: c# properties .net-4.5


【解决方案1】:

调用方法并传入MyClass.MyProperty的问题是,将属性的值发送给方法。您可以尝试使用反射从该值中获取属性名称,但这有两个问题:

1 - 属性需要有一个值。

2 - 如果同一类型的两个属性具有相同的值,则无法(至少据我所知)区分两者。

您可以做的是使用Expression 将属性传递给方法,获取该表达式的主体,最后是成员(属性)名称:

 public static string GetPropertyName<T, P>(Expression<Func<T, P>> propertyDelegate)
 {
     var expression = (MemberExpression)propertyDelegate.Body;
     return expression.Member.Name;
 }

并使用它:

string myPropertyName = GetPropertyName((MyClass x) => x.SomeProperty);

【讨论】:

  • 好的!这可行,但缺点是它会破坏其位置的编辑和继续。
猜你喜欢
  • 1970-01-01
  • 2011-05-20
  • 2012-01-08
  • 2021-12-04
  • 1970-01-01
  • 2011-02-15
  • 2018-11-16
  • 2020-10-05
  • 2011-02-04
相关资源
最近更新 更多