問題確定CollectionBase的類型:
是否有一個靜態的方式可靠地確定由從CollectionBase
衍生,使用反射或Microsoft.Cci類型包含的類型?經由反射(或Microsoft.Cci)
背景:
我工作的一個代碼生成的副本類型,使得這些類型的定製版本,之間的轉換器。它通過Microsoft.Cci遍歷源程序集中的類型。它使用文本模板打印出源代碼。它做了很多轉換和定製,並拋出了我不關心的代碼。
在我生成的代碼中,我打算用CollectionBase
,IEnumerable<T>
或T[]
以前的地方代替List<T>
。我想使用List<T>
,因爲我很確定我可以序列化它,而無需額外的工作,這對我的應用程序很重要。每種情況下都是具體的。我試圖不復制CollectionBase
類,因爲我不得不復制自定義實現,並且我想避免在我的代碼生成器中這樣做。
我遇到問題的唯一部分是在更換定製CollectionBase
時,確定T
爲List<T>
。
我到目前爲止已經完成:
我簡要地看了看MSDN文檔和示例CollectionBase
,和他們提到建立在你的派生類型的定製Add
方法。我不認爲這是以任何方式強制執行的,所以我不確定我可以依靠這一點。一個實現者可以將其命名爲其他東西,或者更糟糕的是,它有一個支持多種類型的集合,其中只有Object
作爲它們唯一的共同祖先。
替代我已經考慮:
也許缺省的序列做了一些技巧,我可以利用的。是否有CollectionBase
集合的默認序列化,或者您通常必須自己實現它?如果您必須自己動手,是否有一些可靠的元數據可以查看以確定類型?如果它支持默認序列化,它是否依賴於集合中項目的運行時類型?
我可以在已知的CollectionBase
類型的代碼生成器中進行映射,映射到它們對應的T
的List<T>
。如果我遇到的給定CollectionBase
類型不在列表中,請拋出異常。如果我沒有可靠的替代方案,這可能是我要做的。
爲什麼'CollectionBase`在這裏相關?另外,您定位的是哪個版本的Visual Studio?請參閱http://msdn.microsoft.com/en-us/library/cc901387(VS.90).aspx,瞭解VS2008的「Cci」命名空間如何變化。 – 2011-01-30 23:43:30
@John:我的目標是3.5。我正在使用公開的2.0-ish源代碼。 `CollectionBase`是相關的,因爲源代碼有源自它的類型,我希望我的目標代碼改變這些屬性和方法來使用`List`。我編輯了我的問題,希望重要的細節現在更清晰:) –
2011-01-30 23:52:01