C# Castle DynamicProxy CreateClassProxyWithTarget未将基础对象用于非拦截属性

C# Castle DynamicProxy CreateClassProxyWithTarget未将基础对象用于非拦截属性,c#,castle-dynamicproxy,C#,Castle Dynamicproxy,我有一些简单的DTO类,如: [XmlType] class Person : AbstractResource { [XmlElement("name")] public virtual string FirstName { get; set; } public virtual string Nickname { get { return "Mister cool"; } } } class SpecialPerson : Person { public override

我有一些简单的DTO类,如:

[XmlType]
class Person : AbstractResource
{
  [XmlElement("name")]
  public virtual string FirstName { get; set; }

  public virtual string Nickname { get { return "Mister cool"; } }
}

class SpecialPerson : Person
{
  public override string NickName { get { return FirstName; } }
}
在我的代码中,我从XML文件中反序列化Person/SpecialPerson对象列表,然后尝试使用CreateClassProxyWithTarget将它们全部封装在代理实例中。出于某种原因,对于任何SpecialPerson代理,FirstName始终为null,昵称为null,但对于任何Person代理,都返回“Mister cool”

我进入调试器并查看了底层的包装对象,它具有所有正确的值。我也注意到不要截取名字或昵称。我希望代理只调用包装对象,在某些情况下它会调用[1],但大多数情况下它不会。我做错了什么


[1] 在我的拦截器代码中,我通过反射设置了包装对象的一些属性,这些属性正确地显示出来。但我不明白为什么这些属性会从底层对象读取,而其他属性则不会。这几乎就像任何被截取的属性在调用Invoke时都会调用包装对象一样,但是对于您为ShouldInterceptMethod返回false的任何方法,它都不会。但这对我来说毫无意义,如果我说不要截取包装对象上的方法,除了使用包装对象的属性之外,还应该采取什么其他可能的操作?

哦,天哪,回答我自己的问题让我感到很难过,但我发现了哪里出了问题,我希望这能帮助其他陷入这种情况的人。我在谷歌上找不到与此相关的任何信息

因此,问题是,即使创建一个封装现有对象的代理(即使用CreateClassProxyWithTarget),它仍然会创建一个全新的对象。碰巧那个对象有一种方法可以得到被包装的对象。对于您未拦截的任何方法、属性等,将在代理对象上调用它们。对于属性,即使属性是虚拟的,它们也不会使用包装对象中的值,因为代理对象拥有所有这些属性的自己副本


要解决这个问题,你必须去掉你的选择钩子,然后截取所有内容。如果它是一个您实际上不想拦截的属性,您可以简单地调用
invocation.continue
。这将导致它将请求转发到包装对象。

回答您自己的问题时不要感到不舒服。StackOverflow支持甚至鼓励这样做(当您创建新问题时,有一个“回答您自己的问题”选项)。这个网站是关于分享知识的,所以很适合你找到答案并在这里发布给其他人在将来找到。它如何与非虚拟财产一起工作?我想让一些属性命中IInterceptor(虚拟属性),其余的属性实际应用于代理对象。非常感谢。我从来没有想到过。一、 同样,完全期望将非截获调用传递给包装对象。对我来说,它们转到新对象是没有意义的(我想这只是代理对象本身的基本实现……但是如果字段中没有任何数据,那就没有帮助了)。在我看来,它的工作方式是相当误导的。