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

时间:2011-07-26 19:52:11

标签: c# reflection properties anonymous-methods aspects

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

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; }

这样在构造函数中我可以反映已定义MyCustomAttribute的Class(Greeter)中的Properties,并将属性的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]; 

1 个答案:

答案 0 :(得分:4)

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

  1. Dynamic proxies
  2. AOP图书馆
  3. 动态代理可能适合您,也可能不适合您,但IMO我更喜欢使用相关方面的解决方案。但是,动态行为将出现在代理类中(通过接口或通过动态子类化和覆盖虚拟属性)。

    但在任何情况下都不会有SetGetMethodSetSetMethod