通过Reflections(或Microsoft.Cci)确定CollectionBase的类型

时间:2011-01-30 23:38:18

标签: reflection cci collectionbase

问题
是否有一种静态方法可以使用Reflection或Microsoft.Cci可靠地确定派生自CollectionBase的类型所包含的类型?

背景
我正在开发一个代码生成器,它可以复制类型,生成这些类型的自定义版本以及它们之间的转换器。它通过Microsoft.Cci遍历源程序集中的类型。它使用文本模板打印出源代码。它进行了大量的转换和自定义,并抛弃了我不关心的代码。

在我生成的代码中,我打算在以前使用List<T>CollectionBaseIEnumerable<T>的所有地方替换T[]。我想使用List<T>,因为我非常确定我可以在没有额外工作的情况下对其进行序列化,这对我的应用程序非常重要。 T在每种情况下都是具体的。我试图不复制CollectionBase类,因为我必须复制自定义实现,并且我想避免在我的代码生成器中执行此操作。

我遇到问题的唯一部分是在替换自定义T时确定List<T> CollectionBase

到目前为止我做了什么
我简要地查看了CollectionBase的MSDN文档和示例,并提到在派生类型上创建自定义Add方法。我不认为这是以任何方式强制执行的,所以我不确定我是否可以依赖它。实现者可以将其命名为其他东西,或者更糟糕的是,有一个支持多种类型的集合,Object是他们唯一的共同祖先。

我考虑的替代方案
也许默认的序列化做了一些我可以利用的技巧。是否有CollectionBase个集合的默认序列化,或者您通常必须自己实现它?如果您必须自己完成,是否有一些可靠的元数据我可以查看以确定类型?如果它支持默认序列化,它是否依赖于集合中项目的运行时类型?

我可以在已知CollectionBase类型的代码生成器中进行映射,映射到T的相应List<T>。如果我遇到的给定CollectionBase类型不在列表中,则抛出异常。如果我没有可靠的替代方案,这可能就是我要去的。

1 个答案:

答案 0 :(得分:0)

我仍然不确定你想做什么来提供建议。您的CollectionBase派生类是否都实现了Add(T)?如果是这样,您可以查找具有除object之外的单个参数的Add方法,并将该类型用于T。