Замените свойство Getter/Setter на Reflection или подобное (без сторонних библиотек) в С#

Например, у меня есть свойство, содержащееся в классе.

public class Greeter {
   private Hashtable _data;
   public string HelloPhrase { get; set; }

   public Greeter(data) {
      _data = data;
   }
}

Что я хотел бы сделать, так это добавить атрибут к свойству HelloPhrase, например

[MyCustomAttribute("Hello_Phrase")]
public string SayHello { get; set; }

Таким образом, во время конструктора я могу отразить свойства в классе (Greeter), где был определен MyCustomAttribute, и установить методы Get/Set свойства для анонимного метода/делегата.

  public Greeter(data) {
      _data = data;
      ConfigureProperties();
   }

Мне удалось получить PropertyInfo из класса, но это предоставляет только GetSetMethod (http://msdn.microsoft.com/en-us/library/system.reflection.propertyinfo.getsetmethod.aspx) и соответствующий GetGetMethod.

Я прочитал некоторые вопросы здесь и в Интернете, но не могу найти ответ, который не использует какую-либо библиотеку Aspects.

Может ли кто-нибудь предоставить указатели на настройку методов Get/Set во время выполнения? В идеале делегату вроде

x =>_data[keyDefinedByAttribute]; 

person Mike Miller    schedule 26.07.2011    source источник


Ответы (1)


Вы не можете этого сделать. Вы не можете динамически менять реализацию геттеров и сеттеров свойств. Ближе всего вы можете получить:

  1. Динамические прокси
  2. АОП-библиотеки

Динамические прокси могут вам подойти или не подойти, но IMO я бы предпочел решение, которое использует это, а не аспекты. Однако динамическое поведение будет отображаться в прокси-классе (либо в интерфейсе, либо путем динамического подкласса и переопределения ваших виртуальных свойств).

Но ни при каких обстоятельствах нет ничего похожего на SetGetMethod или SetSetMethod.

person Kirk Woll    schedule 26.07.2011
comment
Спасибо, я начал думать, что это был случай, который не является большой проблемой для меня. Я, вероятно, попробую это с перехватом единства, поскольку я это знаю, а затем посмотрю на более легкие библиотеки. - person Mike Miller; 26.07.2011
comment
Можете ли вы объяснить, почему вы считаете, что прокси лучше АОП? - person crush; 26.03.2018
comment
Я думаю, что я бы посмотрел на это, @crush, так, что динамические прокси — это крошечное подмножество того, что предоставляет АОП, и поэтому его потенциальное влияние ограничено. YMMV. - person Kirk Woll; 27.03.2018