如何将财产转换为它的名字?

时间:2014-04-26 07:55:22

标签: c#

任何人都可以帮我解决这个问题:

public class MyClass
{

public int MyProperty{ get; set; }


  private void MyMethod()
  {
    // here I wat to get the name of MyProperty.
    // string name = "MyProperty"; <-- I don't want to hardcode it like this.
  } 
}

我不想硬编码。 它可以吗?

偷偷摸摸你

1 个答案:

答案 0 :(得分:7)

一种选择是使用表达式树:

var name = ExpressionTrees.GetPropertyName<MyClass, int>(x => x.MyProperty);

...


public static class ExpressionTrees
{
    public static string GetPropertyName<TSource, TTarget>
         (Expression<Func<TSource, TTarget>> expression)
    {
        ...
    }
}

(替代方法可以帮助进行类型推断,但我会在这里切入追逐。)

如果您重命名MyProperty,那么如果您将其作为重构,那么您在GetPropertyName调用中的使用也会发生变化,否则您将遇到编译时失败。

Stack Overflow上有很多关于如何从表达式树中提取名称的帖子,但值得注意的是,这仍然存在潜在的缺陷方法 - 没有什么可以阻止你写作:

ExpressionTrees.GetPropertyName<MyClass, int>(x => 0);

您可以在执行时检测到,但不能在编译时检测到。还有性能问题 - 它不会可怕,但它可能不是理想

根据您的要求(在这种情况下,您确切地想要识别该属性而不是另一个属性),其他方法可能会很好用,例如属性。