我想知道是否有人可以帮助我 - 我没有做太多反思,但了解基本原理。
我正在尝试做的事情:
我正在开发一个类,该类收集大量有关本地系统、网络等的信息,用于自动错误报告。我(理想情况下)希望能够将批次序列化为 XML 字符串并仅将其显示在文本框中,而不是每次添加新属性时都必须更改测试工具。
不幸的是,框架不会对只读属性(几乎所有我的属性)使用默认的 XML 序列化器,因为它们无法正确反序列化
[不确定我是否同意任何序列化的东西都必须反序列化的假设 - MS 说这是一个“设计”的功能,我想我可以理解 - 也许一个标签表明它应该被序列化会是有利的?]
最初的方法是使属性可获取和可设置(在设置器上抛出异常),但之后整理的工作量似乎有点过多,我希望这些属性在最终版本中是只读的。
我需要什么帮助:
我当前的计划是使用反射来递归地迭代我最顶层的聚集类的每个(公共)属性。问题是,我见过的示例不会递归处理事情。此外,我只想检查对象的属性(如果它位于我的程序集中之一) - 否则只需对其调用 .ToString 即可。
如果我没有将检查限制在我的程序集中,我假设我会得到(比如说)一个字符串,其中包含一个 Length,而该 Length 又将具有 .Tostring 方法...
为了这个项目的目的,我可以almost保证我的代码中没有循环引用,因为这只会用作开发工具,所以我不会too担心它时不时地胡作非为。
我很感激一些例子/建议。
提前谢谢了。
希望这能让您开始。它将树直接打印到控制台,因此您需要进行调整以输出 XML。然后更改 IsMyOwnType 方法以过滤掉您感兴趣的程序集,现在它只关心与自身相同的程序集中的类型。
Shared Sub RecurseProperties(o As Object, level As Integer)
For Each pi As PropertyInfo In o.GetType().GetProperties()
If pi.GetIndexParameters().Length > 0 Then Continue For
Console.Write(New String(" "c, 2 * level))
Console.Write(pi.Name)
Console.Write(" = ")
Dim propValue As Object = pi.GetValue(o, Nothing)
If propValue Is Nothing Then
Console.WriteLine("<null>")
Else
If IsMyOwnType(pi.PropertyType) Then
Console.WriteLine("<object>")
RecurseProperties(propValue, level+1)
Else
Console.WriteLine(propValue.ToString())
End If
End If
Next
End Sub
Shared Function IsMyOwnType(t As Type) As Boolean
Return t.Assembly Is Assembly.GetExecutingAssembly()
End Function
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)