我正在尝试尽可能简单地创建缓存代理类。我已经通过一些简单的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);
我有什么可以通过反思来做出像这样的工作吗?
答案 0 :(得分:2)
我有什么可以通过反思来制作像这样的作品吗?
不,没有什么可以实现的,特别是如果属性不是虚拟的。如果属性是虚拟的,您可以使用Castle.DynamicProxy之类的框架来执行面向方面编程。流行的模拟框架(如Rhino Mocks和NSubstitute)使用它来生成运行时代理对象。当然这只适用于虚拟成员。在您显示的示例中,您有一个无法编织的静态属性。
您可以使用PostSharp
之类的后期编译处理工具来实现这一目标。他们通过修改生成的IL来工作。