2010-12-06 156 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 + "\"); } });");