Reflection 遍历并查找复杂对象图中的所有给定类型实例

Reflection 遍历并查找复杂对象图中的所有给定类型实例,reflection,vb.net-2010,binary-serialization,object-graph,Reflection,Vb.net 2010,Binary Serialization,Object Graph,(使用vb.Net 4.0)假设您有一个对象,其图形相当复杂-它有属性、数组和其他集合,具有自己属性和集合的子类,等等。我想完全遍历整个对象图形,找到特定类型T的所有实例,然后对这些实例执行特定操作。是否有一种防弹的方法来执行对象图的完全遍历?即使进行反思,这似乎也是一项容易出错的艰巨任务 我想知道二进制序列化,因为它似乎以一种相当健壮的方式克隆了一个对象,不管它有多复杂。是否有任何方法可以修改该技术,使其不是序列化而是返回对给定类型T的所有子对象的引用列表?但这只是纯粹的猜测,我愿意接受任何可

(使用vb.Net 4.0)假设您有一个对象,其图形相当复杂-它有属性、数组和其他集合,具有自己属性和集合的子类,等等。我想完全遍历整个对象图形,找到特定类型T的所有实例,然后对这些实例执行特定操作。是否有一种防弹的方法来执行对象图的完全遍历?即使进行反思,这似乎也是一项容易出错的艰巨任务


我想知道二进制序列化,因为它似乎以一种相当健壮的方式克隆了一个对象,不管它有多复杂。是否有任何方法可以修改该技术,使其不是序列化而是返回对给定类型T的所有子对象的引用列表?但这只是纯粹的猜测,我愿意接受任何可行的解决方案。

我找到了一种方法,尽管它可能不是最好的。因为我的对象的图是嵌套的和复杂的,所以我决定依赖于二进制序列化,因为在我(有限的)经验中,它提供了最彻底、最健壮的图遍历。缺点是二进制序列化可能会显著影响性能,但在基准测试之后,它似乎并不是我的特定情况的限制因素

基本上,我的类型T实现了ISerializable,然后我可以通过向类中添加以下内容来处理后序列化:

 Protected Sub New(ByVal info As System.Runtime.Serialization.SerializationInfo,
                           ByVal context As System.Runtime.Serialization.StreamingContext)
另一种方法(不实现Iserializable)是创建具有“OnDeserialized”属性的后序列化方法

无论如何,您可以将信息放入streamingContext对象中,我用它来描述我希望对T型实例执行的操作。因此,基本上,序列化父对象,它将查找并序列化T类型的所有子对象,然后对其进行编码以在反序列化时执行任何所需的任务。接下来,您将只处理序列化对象

显然,序列化可能会有复杂的情况,而且这种方法不适用于所有情况。在表演方面也很不雅观。但我需要一个无麻烦且彻底的对象图遍历,这样就可以了