2011-01-30 67 views
1

問題確定CollectionBase的類型:
是否有一個靜態的方式可靠地確定由從CollectionBase衍生,使用反射或Microsoft.Cci類型包含的類型?經由反射(或Microsoft.Cci)

背景
我工作的一個代碼生成的副本類型,使得這些類型的定製版本,之間的轉換器。它通過Microsoft.Cci遍歷源程序集中的類型。它使用文本模板打印出源代碼。它做了很多轉換和定製,並拋出了我不關心的代碼。

在我生成的代碼中,我打算用CollectionBase,IEnumerable<T>T[]以前的地方代替List<T>。我想使用List<T>,因爲我很確定我可以序列化它,而無需額外的工作,這對我的應用程序很重要。每種情況下都是具體的。我試圖不復制CollectionBase類,因爲我不得不復制自定義實現,並且我想避免在我的代碼生成器中這樣做。

我遇到問題的唯一部分是在更換定製CollectionBase時,確定TList<T>

我到目前爲止已經完成
我簡要地看了看MSDN文檔和示例CollectionBase,和他們提到建立在你的派生類型的定製Add方法。我不認爲這是以任何方式強制執行的,所以我不確定我可以依靠這一點。一個實現者可以將其命名爲其他東西,或者更糟糕的是,它有一個支持多種類型的集合,其中只有Object作爲它們唯一的共同祖先。

替代我已經考慮
也許缺省的序列做了一些技巧,我可以利用的。是否有CollectionBase集合的默認序列化,或者您通常必須自己實現它?如果您必須自己動手,是否有一些可靠的元數據可以查看以確定類型?如果它支持默認序列化,它是否依賴於集合中項目的運行時類型?

我可以在已知的CollectionBase類型的代碼生成器中進行映射,映射到它們對應的TList<T>。如果我遇到的給定CollectionBase類型不在列表中,請拋出異常。如果我沒有可靠的替代方案,這可能是我要做的。

+0

爲什麼'CollectionBase`在這裏相關?另外,您定位的是哪個版本的Visual Studio?請參閱http://msdn.microsoft.com/en-us/library/cc901387(VS.90).aspx,瞭解VS2008的「Cci」命名空間如何變化。 – 2011-01-30 23:43:30

+0

@John:我的目標是3.5。我正在使用公開的2.0-ish源代碼。 `CollectionBase`是相關的,因爲源代碼有源自它的類型,我希望我的目標代碼改變這些屬性和方法來使用`List `。我編輯了我的問題,希望重要的細節現在更清晰:) – 2011-01-30 23:52:01

回答

0

我仍然不確定你想要提供建議。不過,您的CollectionBase派生類是否都實現了Add(T)?如果是這樣的話,你可以尋找一個添加方法,使用單個參數的類型而不是對象,並使用該類型的T。