gpt4 book ai didi

c# - CaSTLe DynamicProxy CreateClassProxyWithTarget 未将基础对象用于非拦截属性

转载 作者:太空宇宙 更新时间:2023-11-03 19:09:07 30 4
gpt4 key购买 nike

我有一些简单的 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 将它们全部包装在代理实例中。出于某种原因,FirstName 对于任何 SpecialPerson 代理始终为 null,NickName 始终为 null,但对于任何 Person 代理返回“Mister cool”。

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

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

最佳答案

哦,亲爱的,我对回答自己的问题感到很遗憾,但我弄清楚出了什么问题,我希望这对遇到这种情况的其他人有所帮助。我无法在谷歌上找到任何关于此的信息。

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

要解决这个问题,您必须摆脱选择钩子(Hook)并截取所有内容。如果它是您实际上不想拦截的属性,您可以简单地调用 invocation.Proceed。这将导致它将请求转发给包装的对象。

关于c# - CaSTLe DynamicProxy CreateClassProxyWithTarget 未将基础对象用于非拦截属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22417654/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com