2010-12-06 161 views
8

比方说,我们有一个属性如下如何从该属性的getter/setter中获取属性名称?

public string SomeProperty 
{ 
    get 
    { 
     var propName = "SomeProperty"; 
     return "<" + propName + ">"; 
    } 
} 

如何我可以从组件信息本身读取设置上述变量propName是属性名的值?

编辑

为什么我们需要这个?

我使用WPF d:DataContext,如here中所述,这将帮助我为绑定属性显示“设计模式”值 - 通常,绑定值在设计模式下显示为空字符串。而在'设计模式'的数据上下文类中,我想返回属性名称来表示每个绑定属性。

希望这可以解释您的疑虑。

+1

请澄清,你会想要做的那。 – 2010-12-06 09:29:34

+0

,你为什么这样做?是否有任何具体要求 – TalentTuner 2010-12-06 09:29:59

+1

所以你想做一个属性,它返回它自己的名字? – 2010-12-06 09:30:56

回答

10

一段时间,我下面找出解决的办法,这是相当方便我后我不知道。

string SomeProperty 
    { 
     get 
     { 
      return GetDesignModeValue(() => this.SomeProperty); 
     } 
    } 

    string GetDesignModeValue<T>(Expression<Func<T>> propertyExpression) 
    { 
     var propName = (propertyExpression.Body as MemberExpression).Member.Name; 
     var value = string.Format(
      "<{0}>" 
      , propName); 
     return value; 
    } 

所以,从现在开始,这是很容易对我们在设计模式时显示的结合特性mocking值。

我希望你会发现有用的有些日子!

4

在运行时没有可靠的方法,但可以使用MethodBase.GetCurrentMethod().Name并丢弃前四个字符。

该方法存在一些缺陷:通过混淆工具运行二进制文件可能会导致该方法重命名。此外,该方法可能会内联并导致问题(如果您仅在字符串上使用Remove而不检查长度,甚至可能会导致发布版本中发生意外崩溃,并且在调试模式下难以重现)。

如果你的代码遵循一个模式,并且你需要生成一堆这样的属性,最好使用编译时方法,如代码生成器或面向方面的编程框架。

1

这也应该工作,但你为什么需要这个

public string SomeProperty 
    { 
     get 
     { 
      StackTrace st = new StackTrace(); 
      StackFrame[] fr = st.GetFrames(); 
      if (fr != null) 
      { 
       var propName = fr[0].GetMethod().Name.Substring(3, fr[0].GetMethod().Name.Length); 
       return "<" + propName + ">"; 
      } 

      return "SomeProperty"; 

     } 
    } 
-3

可以将属性的名称传递给getter。

如果MyObj中是对象,而如果PROPNAME是变量持有物业的名称,然后将下面的代码做的工作:

eval("Object.defineProperty(MyObj, PropName, { " + 
    "get : function() { return(\"the prop name is " + PropName + "\"); } });");