gpt4 book ai didi

c# - 如何使用带反射的递归来研究具有循环依赖性的类实例?

转载 作者:行者123 更新时间:2023-11-30 22:22:23 24 4
gpt4 key购买 nike

假设您有以下类(class):

Class P  
{
string m_Name;
P m_spouse;
}

和 P 的两个实例:
A。汤姆的配偶是安妮
b.安妮的配偶是汤姆

现在我正尝试通过反射来调查 Tom 的实例以进行序列化。当我注意到值类型时,我会以 Xml 格式写下它们的名称和值。问题是当我调查引用类型时,例如 Tom 的配偶,因为然后对 Annie 进行了递归调用,但是在调查 Annie 时,我很快就会再次调查她的配偶 Tom,这是不正常的,因为这永远不会结束。

问题

  1. 关于如何实现这种最终会停止的递归有什么想法吗?
  2. 考虑到我需要自己实现序列化功能。
    你认为我可以在不使用反射的情况下序列化一个实例来调查它吗?
    有没有办法在没有反射的情况下序列化实例?

非常感谢

最佳答案

这是一个基本算法...(伪代码)

function examine(m,examined_so_far=[])
{
result_stuff = something_special
i = get_unique_identifier(m)
if i in examined_so_far
return result_stuff?
examined_so_far.append(i)

attributes = get_attributes(m)

for att in attributes:
result_stuff.add(examine(att, examined_so_far))
do_processing(result_stuff)
return result_stuff
}

英语:

维护一个你已经看过的东西的列表。这可以通过使用唯一标识符初始化每个 M 实例或使用实例的内存位置来完成。

假设 joe 和 sue 是共同的配偶,您调用 examine(joe)

级别 1:result_stuff 已初始化(我不知道你在这里想要什么),joe 的标识符已添加到列表中

级别 2:检查 sue 并将她的标识符添加到列表中

级别 3:检查 joe 并且他的标识符已经在列表中,因此返回一些结果内容

level 2:从level 3获取结果,做一些处理并返回相关结果

级别 1:从级别 2 等获取结果

关于你的第二个问题......

我对 C# 很生疏,所以我不确定是否有更好的方法来做到这一点,但这是我的第一个想法:为什么不维护一个应该按类序列化的属性名称数组?我确定您可以通过名称以某种方式访问​​属性。与在 Python 中一样,以下两个语句是等价的:a = some_object.fooa=some_object.__getattribute__('foo')

然后您要做的是让 M 的 serailize-array 包含一个包含信息 'spouse' 的条目,然后在序列化它时您将遍历数组。像这样的东西(也是伪代码......):

serial_rep = '{'
for att in self.serialize_array:
serial_representation += att + ':'
serial_representation = serialize(obj.__getattribute__(att))
serial_representation += ','
remove_last_comma(serial_representation)
serial_rep += '}'

然后在对属性调用 serialise 时,您只需检查它是否具有 serialise_array 或者它是否为基本类型。

例如:

if type(obj) == int:
return obj
if type(obj) == str:
return '"'obj+'"'
if obj.has_attribute(serialise_array):
serial_rep = '{'
for att in self.serialize_array:
etc

关于c# - 如何使用带反射的递归来研究具有循环依赖性的类实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13861916/

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