C# 正在将代理目标属性设置为代理属性对应项

C# 正在将代理目标属性设置为代理属性对应项,c#,properties,castle,proxy-classes,castle-dynamicproxy,C#,Properties,Castle,Proxy Classes,Castle Dynamicproxy,假设我有以下代码示例: public class A { public virtual string Text { get; set; } } 我生成了一个a的代理: A aProxy = ... // Code to generate the whole proxy aProxy.Text = "hello world"; 现在我施放aProxy来获得它的目标: IProxyTargetAccessor accessor = (IProxyTargetAccessor)aProx

假设我有以下代码示例:

public class A 
{
    public virtual string Text { get; set; }
}
我生成了一个
a
的代理:

A aProxy = ... // Code to generate the whole proxy
aProxy.Text = "hello world";
现在我施放aProxy来获得它的目标:

IProxyTargetAccessor accessor = (IProxyTargetAccessor)aProxy;
A target = (A)aProxy.DynProxyGetTarget();
我将
Text
设置为
target

target.Text = "bye!";
我不明白为什么
aProxy
也会获取整个属性集。它们应该是不同的对象实例,因为一个是封装整个目标的代理,另一个是目标本身

bool equal = target.Text == aProxy.Text; // TRUE: What's going on?
bool referenceEqual = ReferenceEquals(target, aProxy); // FALSE

您遗漏了一条关键信息:代理生成代码。对于如何生成代理,有很多选项,这可能会影响您看到的内容。在一次快速测试中,我从我的ReferenceEquals调用中得到了一个
true
。@PatrickSteele嗯,你说得对。我可以添加我的代理生成代码。几小时后我会做的。顺便说一句,我可以给你额外的信息:这是一个带有target、mixin和hook的代理生成。@PatrickSteele现在我已经仔细检查了你的评论。。。代理和整个目标如何成为对同一对象的引用?这不应该也发生…为什么你觉得这不应该发生?我只是做了
newproxygenerator().CreateClassProxy()
和DP动态创建并编译了
a
的子类,该子类具有DP功能所需的所有管道。部分管道将实现
IProxyTargetAccessor.DynProxyGetTarget
。它的实现可以简单地返回
this
。为什么它会返回任何其他内容?@PatrickSteele可能我弄错了,但是带有target的类代理(method
CreateClassProxyWithTarget
)创建了一个与目标不同的代理实例,但整个代理设置了目标的属性对应项。另一方面,目标与代理实例没有依赖关系。您遗漏了一条关键信息:代理生成代码。对于如何生成代理,有很多选项,这可能会影响您看到的内容。在一次快速测试中,我从我的ReferenceEquals调用中得到了一个
true
。@PatrickSteele嗯,你说得对。我可以添加我的代理生成代码。几小时后我会做的。顺便说一句,我可以给你额外的信息:这是一个带有target、mixin和hook的代理生成。@PatrickSteele现在我已经仔细检查了你的评论。。。代理和整个目标如何成为对同一对象的引用?这不应该也发生…为什么你觉得这不应该发生?我只是做了
newproxygenerator().CreateClassProxy()
和DP动态创建并编译了
a
的子类,该子类具有DP功能所需的所有管道。部分管道将实现
IProxyTargetAccessor.DynProxyGetTarget
。它的实现可以简单地返回
this
。为什么它会返回任何其他内容?@PatrickSteele可能我弄错了,但是带有target的类代理(method
CreateClassProxyWithTarget
)创建了一个与目标不同的代理实例,但整个代理设置了目标的属性对应项。另一方面,目标与代理实例没有依赖关系。