Как получить текущее имя свойства через отражение?

WPF/XAML не обеспечивает эту функциональность исходно, но это действительно обеспечивает расширяемость, чтобы позволить Вам делать то, что Вы хотите.

Мы столкнулись с той же потребностью и закончили тем, что создали наше собственное Расширение Разметки XAML (который мы назвали "MergedStylesExtension"), чтобы позволить нам создавать новый стиль из двух других стилей (который, в случае необходимости, мог, вероятно, использоваться многократно подряд для наследования еще большему количеству стилей).

из-за ошибки WPF/XAML, мы должны использовать синтаксис элемента свойства для использования его, но кроме которого это, кажется, работает хорошо. Например,


я недавно записал об этом здесь: http://swdeveloper.wordpress.com/2009/01/03/wpf-xaml-multiple-style-inheritance-and-markup-extensions/

38
задан Tomasz Smykowski 30 July 2009 в 11:45
поделиться

5 ответов

Поскольку свойства на самом деле являются просто методами, вы можете сделать это и очистить get_ возвращается:

class Program
    {
        static void Main(string[] args)
        {
            Program p = new Program();
            var x = p.Something;
            Console.ReadLine();
        }

        public string Something
        {
            get
            {
                return MethodBase.GetCurrentMethod().Name;
            }
        }
    }

Если вы профилируете производительность, вы должны обнаружить, что MethodBase.GetCurrentMethod () на несколько миль быстрее, чем StackFrame. В .NET 1.1 у вас также будут проблемы со StackFrame в режиме выпуска (по памяти я думаю, что обнаружил, что он был в 3 раза быстрее).

Тем не менее, я уверен, что проблема с производительностью не вызовет особых проблем, хотя интересное обсуждение медленности StackFrame можно найти здесь .

52
ответ дан 27 November 2019 в 03:31
поделиться

Используйте вместо него MethodBase.GetCurrentMethod ()!

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

Вы можете использовать имя метода доступа из стека вызовов с помощью System.Diagnostics. Однако StackTrace .

    string GetPropertyName()
    {
        StackTrace callStackTrace = new StackTrace();
        StackFrame propertyFrame = callStackTrace.GetFrame(1); // 1: below GetPropertyName frame
        string properyAccessorName = propertyFrame.GetMethod().Name;

        return properyAccessorName.Replace("get_","").Replace("set_","");
    }
5
ответ дан 27 November 2019 в 03:31
поделиться

Я хотел бы больше узнать о контексте, в котором он вам нужен, поскольку мне кажется, что вы уже должны знать, с каким свойством вы работаете в инструменте доступа к свойству. Однако при необходимости вы, вероятно, могли бы использовать MethodBase.GetCurrentMethod () .Name и удалить что-либо после get_ / set_ .

Обновление :

На основе ваши изменения, я бы сказал, что вы должны использовать наследование, а не отражение. Я не знаю, какие данные есть в вашем словаре, но мне кажется, что вы действительно хотите иметь разные классы автомобилей, скажем, Sedan, Roadster, Buggy, StationWagon, а не сохранять тип в локальной переменной. Тогда у вас будут реализации методов, которые подходят для этого типа автомобилей. Вместо того, чтобы выяснять, какая у вас машина, а затем что-то делать, затем вы просто вызываете соответствующий метод, и объект Car выполняет правильные действия в зависимости от его типа.

 public interface ICar
 {
      void Drive( decimal velocity, Orientation orientation );
      void Shift( int gear );
      ...
 }

 public abstract class Car : ICar
 {
      public virtual void Drive( decimal velocity, Orientation orientation )
      {
          ...some default implementation...
      }

      public abstract void Shift( int gear );

      ...
 }

 public class AutomaticTransmission : Car
 {
       public override void Shift( int gear )
       {
          ...some specific implementation...
       }
 }

 public class ManualTransmission : Car
 {
       public override void Shift( int gear )
       {
          ...some specific implementation...
       }
 }
7
ответ дан 27 November 2019 в 03:31
поделиться

Да, это так!

string test = "test string";
Type type = test.GetType();

PropertyInfo[] propInfos = type.GetProperties();
for (int i = 0; i < propInfos.Length; i++) 
{
    PropertyInfo pi = (PropertyInfo)propInfos.GetValue(i);
    string propName = pi.Name;
}
0
ответ дан 27 November 2019 в 03:31
поделиться

Попробуйте использовать System.Diagnostics. StackTrace для отражения в стеке вызовов. Свойство должно быть где-то в стеке вызовов (возможно, вверху, если вы вызываете его непосредственно из кода свойства).

0
ответ дан 27 November 2019 в 03:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: