【问题标题】:Replace Property Getter/Setter with Reflection or similar (no 3rd party libraries) in c#在 c# 中用反射或类似(没有第 3 方库)替换属性获取器/设置器
【发布时间】:2011-10-13 17:23:30
【问题描述】:

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

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) 中的属性,并将该属性的 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]; 

【问题讨论】:

    标签: c# reflection properties anonymous-methods aspects


    【解决方案1】:

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

    1. Dynamic proxies
    2. AOP 库

    动态代理可能适合也可能不适合您,但 IMO 我更喜欢使用它而不是方面的解决方案。但是,动态行为将在代理类(接口或通过动态子类化和覆盖您的虚拟属性)中呈现。

    但在任何情况下都没有像SetGetMethod 或SetSetMethod 这样的东西。

    【讨论】:

    • 谢谢 我开始认为这对我来说不是什么大问题。据我所知,我可能会尝试使用统一拦截,然后查看更轻量级的库。
    • 你能说说你认为代理优于 AOP 的原因吗?
    • 我想我的看法是,@crush,动态代理只是 AOP 提供的一小部分,因此它的潜在影响是有限的。 YMMV。
    猜你喜欢
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多