问题:
是否有一种静态方法可以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我遇到的给定类型不在列表中,则抛出异常。如果没有可靠的替代方案,这可能就是我会选择的。