2010-12-06 2 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 в строке без проверки длины, это может даже вызвать непредвиденные сбои в сборке Release, которые трудно воспроизвести в режиме отладки).

Если ваш код следует шаблону, и вам нужно создать кучу таких свойств, лучше использовать подход, основанный на компиляции, например, генератор кода или аспектно-ориентированную структуру программирования.

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

Можно передать имя собственности получателю.

если MyObj является объектом, и если Имя_свойства переменная держит имя свойства, то следующий код делает эту работу:

eval("Object.defineProperty(MyObj, PropName, { " + 
    "get : function() { return(\"the prop name is " + PropName + "\"); } });"); 
Смежные вопросы