可以使用Castle Dynamic Proxy将代理功能添加到已生成且非空的对象中吗?
我试过这个:
Dog _myDog=new Dog();
_myDog.Name="Fuffy";
var _proxyDog = generator.CreateClassProxyWithTarget<Dog>(_myDog, ProxyGenerationOptions.Default, new DogInterceptor());
_proxyDog
作为新对象产生。
现在这只是一个例子,在实际应用中我的对象有30多个属性,我想知道我是否可以避免逐个复制这些道具!
答案 0 :(得分:2)
是的。唯一的问题是:ProxyGenerator无论如何都需要实例化该类型的对象。这段代码实际上在我的项目中正常工作:
public static class MongoExtensions
{
static readonly ProxyGenerator pg = new ProxyGenerator();
public static MongoCollection GetRetryCollection(this MongoDatabase db, string collectionName, int retryCount = 5, int pauseBetweenRetries = 2000)
{
var coll = db.GetCollection(collectionName);
return (MongoCollection)pg.CreateClassProxyWithTarget(typeof(MongoCollection), coll, new object[] { db, collectionName, coll.Settings }, new RetryingInterceptor { RetryCount = retryCount, PauseBetweenCalls = pauseBetweenRetries });
}
}
CreateClassProxyWithTarget的参数是:
我无法解释为什么它需要对象的构造函数参数,但这段代码对我来说是正确的。
答案 1 :(得分:0)
我有同样的问题所以使用vlad的建议这对我有用:
var _proxyDog = generator.CreateClassProxyWithTarget(_myDog.GetType(), _myDog, new DogInterceptor());
从我所看到的,创建了一个新的包装器(代理)来模拟真实的类,包装的类(目标)是我的原始对象。
附加:nope我再次检查并且'目标类型'是正确的但代理不反映其中设置的值。我认为这是一个错误;和一个大的。
从第一张图片中可以看到所有导入都满足的原始类。
图片在这里...... 遗憾的是,我无法发布图片给你看,因为看起来我需要一个'10'的声誉;显然。这有多愚蠢?遗憾。
正如您所看到的,代理上的属性都是null且不完整,但“_target”下的原始类仍然完好无损。探测代理属性会导致异常行为,您不需要检查目标,因为您将避免装饰器的目的。
这里有另一张图片......
我希望所有的属性都可以完全模仿基础类;或者它们都没有,并且映射是动态的。因为它对我来说也不起作用,因为我真正想要访问的一个属性暴露的值不正确。
科林。
答案 2 :(得分:0)
原始问题中的方法很好。但是,您需要确保要包装的类中的所有属性都标记为虚拟。