问题:
是否有一种静态方法可以CollectionBase
使用 Reflection 或 Microsoft.Cci 可靠地确定派生自 的类型所包含的类型?
背景:
我正在开发一个代码生成器,它可以复制类型、制作这些类型的自定义版本以及在它们之间进行转换器。它通过 Microsoft.Cci 遍历源程序集中的类型。它使用文本模板打印出源代码。它进行了大量的转换和自定义,并丢弃了我不关心的代码。
在我生成的代码中,我打算替换以前使用过List<T>
的任何地方 a CollectionBase
、IEnumerable<T>
或。T[]
我想使用List<T>
是因为我很确定我可以在不做额外工作的情况下对其进行序列化,这对我的应用程序很重要。 T
在任何情况下都是具体的。我试图不复制CollectionBase
类,因为我必须复制自定义实现,并且我想避免在我的代码生成器中这样做。
我唯一遇到问题的部分是确定T
何时List<T>
更换 custom CollectionBase
。
到目前为止我所做的:
我简要查看了 MSDN 文档和示例,他们提到在派生类型上CollectionBase
创建自定义方法。Add
我不认为这是以任何方式强制执行的,所以我不确定我是否可以依赖它。实现者可以将其命名为其他名称,或者更糟的是,拥有一个支持多种类型的集合,并将Object
其作为它们唯一的共同祖先。
我考虑过的替代方案:
也许默认序列化有一些我可以利用的技巧。是否有CollectionBase
集合的默认序列化,或者您通常必须自己实现它?如果您必须自己做,是否有一些可靠的元数据我可以查看以确定类型?如果它支持默认序列化,它是否依赖于集合中项目的运行时类型?
我可以在我的代码生成器中创建一个已知CollectionBase
类型的映射,映射到它们对应T
的 for List<T>
。如果CollectionBase
我遇到的给定类型不在列表中,则抛出异常。如果没有可靠的替代方案,这可能就是我会选择的。