【发布时间】:2019-02-07 20:22:01
【问题描述】:
我正在使用以下方法递归地遍历对象的属性:
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);
问题不在于循环引用(我没有),而在于DateTime、int 和decimal 等属性类型。假设它们是原始的,但 IsPrimitive 属性是 false。
我可以区分这些类型和我自己的类吗?
【问题讨论】:
-
你应该查找访问者模式并且只遍历没有被访问过的对象类型。
-
添加异常处理程序 try/catch。错误可能是您的内存不足。在代码运行时打开任务管理器。
-
@jdweng 对不起,但这两个帐户都是错误的。首先,正如@Daniel 在他的回答中指出的那样,您无法捕捉到您没有手动抛出的
StackOverlflowException。其次,如果问题是进程内存不足,则会抛出OutOfMemoryException,现在是堆栈溢出。 -
你可能甚至不需要在这里递归。请参阅 Eric Lippert 的通过堆栈遍历的方法:stackoverflow.com/a/20335369/1316856
-
string不会也通过您的typeof(IEnumerable).IsAssignableFrom条件吗?
标签: c# recursion reflection