我們可以把元數據理解為隨類型一起導出的附加信息。有時候我們會考慮,把元數據隨類型一並導出,增加一些說明,使得我們在導入的時候,可以多一些篩選條件。
上面的內容我說得比較簡潔,也許您不是很理解,不要緊,在編程裡面,很多東西我們都是寫了代碼後才理解的。所以,我的理論功底比較差,最不擅長的就是長篇大論,還是從代碼中看吧。
我們首先要弄清楚一下問題:在我沒有手動去添加元數據的默認導出類型,是否帶有元數據。為了使代碼更簡單,這裡我直接把一個類導出,而不編寫公共接口了。
這裡我們直接編寫一個類,然後直接導入這個類型即可:
示例代碼定在當前程序集中,可以在AssemblyCatalog范圍查找。
AssemblyCatalog的Parts屬性在智能提示中沒有出現(從ComposablePartCatalog類繼承下來,可能是因為虛方法沒有被重寫,所以沒有在智能提示中顯示出來),不過的確有這個屬性,通過枚舉Parts訪問每個導出的組件類,而在ExportDefinitions屬性中的每個ExportDefinition對象都有一個Metadata屬性,它就是每個導出的元數據,為字典類型(IDictionary<string, object>),key是字符串類型,value是任意對象(Object)。
運行應用程序後,我們會看到如下圖所示的內容:
這個例子表明,在默認情況下,導出是帶有元數據的,從上面的運行結果可以猜到默認的元數據是用於說明導出組件的類型的。
要導出元數據,除了對目標類型應用ExportAttribute特性外,還要用ExportMetadataAttribute特性來定義元數,在定義時遵循字典結構,即構造函數的兩個參數分別代表key和value。如下面代碼:
這兩個元數據標記本組件的版本為200,作者是小王。我們知道元數據是IDictionary<string, object>字典結構,這就好辦,我們在導入的時候使用Lazy<T, TMetadata>,以前我們用過Lazy<T>,現在因為帶了元數據,所以就用Lazy<T, TMetadata>,然後讓TMetadata的類型為IDictionary<string, object>就可以了。示例代碼如下:
好了,運行一下,如圖所示,我們已經把元數據也導入了。
還有另一種較為復雜的元數據導出導入方式,那就是自己實現的強類型元數據。我們來動手做做。
在定義接口時,並加上MetadataViewImplementation特性,且指明哪些類將實現該接口。
2、上面我們指定了實現ICustMetadata的類為MyCustMetaData,所以接下來我們要定義這個類。
4、把調用的代碼修改如下:
最後就得到如下圖所示的結果:
元數據的實際類型正好是我們上面定義的MyCustMetaData類。
今天就到此為止吧,88各位。