Замените Property Getter / Setter на Reflection или аналогичный (без сторонних библиотек) в c # - PullRequest
6 голосов
/ 26 июля 2011

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

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.

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

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

x =>_data[keyDefinedByAttribute]; 

1 Ответ

4 голосов
/ 26 июля 2011

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

  1. Динамические прокси
  2. AOP библиотеки

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

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

...