Castle DynamicProxy CreateClassProxyWithTarget不使用基础对象用于非拦截属性

时间:2014-03-14 23:39:20

标签: 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 string NickName { get { return FirstName; } }
}

在我的代码中,我从XML文件中反序列化Person / SpecialPerson对象的列表,然后尝试使用CreateClassProxyWithTarget将它们全部包装在代理实例中。出于某种原因,对于任何SpecialPerson代理,FirstName始终为null并且NickName为null,但对于任何Person代理都返回“Mister cool”。

我进入调试器并查看底层包装对象,它具有所有正确的值。我也注意不要拦截FirstName或Nickname。我希望代理只是简单地调用包装对象,在某些情况下它会[1]但是对于大多数情况它不会。我做错了什么?

[1]在我的拦截器代码中,我通过反射设置了包装对象的一些属性,那些正确显示。但我不明白为什么这些属性会从底层对象中读取,但其他属性则不会。这几乎就像任何截获的属性在调用Invoke时总是会调用包装对象,但是对于任何方法,你都没有为ShouldInterceptMethod返回false。但这对我来说没有任何意义,如果我说不拦截一个包装对象的方法应该采取什么其他可能的操作,而只是使用包装对象的属性?

1 个答案:

答案 0 :(得分:6)

哦,亲爱的,我对回答自己的问题感到很难,但我找出了出了什么问题,我希望这会有助于其他遇到这种情况的人。我无法在谷歌上找到任何关于此的内容。

所以问题是,即使你创建一个包装现有对象的代理(即使用CreateClassProxyWithTarget),它仍然创建一个全新的对象。只是碰巧该对象有一种获取包装对象的方法。对于您不拦截的任何方法,属性等,它们将在代理对象上称为。对于属性,这些属性不会使用包装对象中的值,即使属性是虚拟的,因为代理对象具有自己的所有属性的副本。

要解决这个问题,你必须摆脱你的选择钩子,然后拦截一切。如果它是您不想实际拦截的财产,则只需致电invocation.Proceed即可。这将导致它将请求转发给包装对象。