3

我试图使缓存代理类的创建尽可能简单。我已经使用简单的 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);

我有什么可以通过反思来完成的事情吗?

4

1 回答 1

2

我有什么可以通过反思来完成的事情吗?

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

您可以使用后编译处理工具PostSharp来实现这一点。它们通过修改生成的 IL 来工作。

于 2013-02-03T18:45:14.207 回答