在c#中用反射或类似的(没有第三方库)替换Property Getter/Setter

Mik*_*ler 6 c# reflection properties anonymous-methods aspects

例如,我有一个包含在类中的属性

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

   public Greeter(data) {
      _data = data;
   }
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是向HelloPhrase属性添加一个属性,就像这样

[MyCustomAttribute("Hello_Phrase")]
public string SayHello { get; set; }
Run Code Online (Sandbox Code Playgroud)

这样在构造函数中我可以反映已经定义了MyCustomAttribute的类(Greeter)中的Properties,并将属性的Get/Set方法设置为匿名方法/委托.

  public Greeter(data) {
      _data = data;
      ConfigureProperties();
   }
Run Code Online (Sandbox Code Playgroud)

我已经设法从类中获取PropertyInfo,但这只暴露了GetSetMethod(http://msdn.microsoft.com/en-us/library/system.reflection.propertyinfo.getsetmethod.aspx)和相应的GetGetMethod.

我已经在这里和网上阅读了一些问题,但找不到不使用某种Aspects库的答案.

任何人都可以提供指向在运行时设置Get/Set方法的指针吗?理想情况下,像一个代表

x =>_data[keyDefinedByAttribute]; 
Run Code Online (Sandbox Code Playgroud)

Kir*_*oll 4

你不能这样做。您无法动态交换属性 getter 和 setter 的实现。您可以获得的最接近的是:

  1. 动态代理
  2. AOP 库

动态代理可能适合也可能不适合你,但在我看来,我更喜欢使用动态代理而不是方面的解决方案。但是,动态行为将在代理类中表现出来(无论是接口还是通过动态子类化和覆盖虚拟属性。)

但在任何情况下都不存在类似SetGetMethodor 的东西SetSetMethod