gpt4 book ai didi

c# - 递归遍历对象的属性抛出 StackOverflowException

转载 作者:太空宇宙 更新时间:2023-11-03 20:54:12 27 4
gpt4 key购买 nike

我正在使用以下方法递归迭代对象的属性:

void GetProps(object obj)
{
if (obj == null)
return;

var objType = obj.GetType();
var properties = objType.GetProperties();

foreach (var property in properties)
{
object value = property.GetValue(obj, null);

if (typeof(IEnumerable).IsAssignableFrom(property.PropertyType))
{
var enumerable = (IEnumerable)value;

foreach (object child in enumerable)
GetProps(child);
}
else
{
GetProps(value);
}
}
}

对象非常复杂(超过 30 个类)。在 GetProps(value) 处深入对象时,我得到了一个 StackOverflowException

有没有办法捕获异常并检查它失败的原因,然后解决问题?

编辑

我在方法的顶部添加了一个故障保护:

if (visited.Contains(obj))
return;

visited.Add(obj);

问题不在于循环引用(我没有),而在于 DateTimeintdecimal 等属性类型.假设它们是原始的,但 IsPrimitive 属性为 false

我可以区分这些类型和我自己的类吗?

最佳答案

A StackOverflowException can't be caught除非你扔了它,因为它表明你的应用程序存在致命问题。

很可能发生这种情况是因为您有一个循环引用。 IE。包含另一个对象的对象,该对象包含对原始对象的引用。两个类之间可能有任意数量的层次结构级别。

你需要实现某种机制来停止遍历你已经遍历过的对象,例如在哈希集的帮助下。

关于c# - 递归遍历对象的属性抛出 StackOverflowException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52138532/

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