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