无论如何反射“注入”代码到静态类?

时间:2013-02-03 18:43:25

标签: c# .net reflection custom-attributes

我正在尝试尽可能简单地创建缓存代理类。我已经通过一些简单的API进行了一些不同的实验,但这并不容易。

现在,我正在研究属性和反思,看看它是否可以“神奇地”解决。例如,给定这个类:

public static MyCache
{
  [Cache("foobar")]
  public static string Foobar { get; set; }
}

并以某种方式生成相当于

的东西
public static MyCache
{
  [Cache("foobar")]
  public static string Foobar
  {
    get
    {
      return (string)Cacher.Get("foobar");
    }
    set
    {
      Cacher.Set("foobar", value, new CacheOptions()); //or whatever
    }
  }
}

虽然这两个版本对调用者看起来都是“正常”,但这是有效的:

MyCache.Foobar="meh";
Assert.IsEqual("meh", MyCache.Foobar);

我有什么可以通过反思来做出像这样的工作吗?

1 个答案:

答案 0 :(得分:2)

  

我有什么可以通过反思来制作像这样的作品吗?

不,没有什么可以实现的,特别是如果属性不是虚拟的。如果属性是虚拟的,您可以使用Castle.DynamicProxy之类的框架来执行面向方面编程。流行的模拟框架(如Rhino Mocks和NSubstitute)使用它来生成运行时代理对象。当然这只适用于虚拟成员。在您显示的示例中,您有一个无法编织的静态属性。

您可以使用PostSharp之类的后期编译处理工具来实现这一目标。他们通过修改生成的IL来工作。