1

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

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

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

我唯一遇到问题的部分是确定T何时List<T>更换 custom CollectionBase

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

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

我可以在我的代码生成器中创建一个已知CollectionBase类型的映射,映射到它们对应T的 for List<T>。如果CollectionBase我遇到的给定类型不在列表中,则抛出异常。如果没有可靠的替代方案,这可能就是我会选择的。

4

1 回答 1

0

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

于 2011-02-14T20:04:29.627 回答