實戰MEF(3) 只匯出類的成員

2022-03-21 02:35:15 字數 3224 閱讀 6248

過前面兩篇文章的介紹,相信各位會明白mef中有不少實用價值。上一文中我們也討論了匯入與匯出,對於匯出匯入,今天我們再深入一點點,嗯,只是深入一點點而已,不會很難的,請大家務必放心,如果大家覺得看文章枯燥,不妨一邊喝牛奶一邊閱讀。

上一文中我們都是把整個型別(整個類)進行匯出,不過有時候,我們可能會考慮只匯出類的某些成員,比如某個屬性或某個欄位等。

我們還是少說理論,免得大家喝不下牛奶,還是直接上菜吧。為了便於測試,以下示例把元件都寫在當前程式集中,也就是在同乙個專案,然後用assemblycatalog來查詢。

首先,定義乙個公共介面iwork。

然後分別用兩個類來實現該介面。

接著,我們再定義乙個總類,包含兩個屬性,分別返回firstwork類和secondwork類的例項。

exportattribute特性只附加在workfirst和worksecond兩個屬性上,works類只匯出這兩個屬性。

隨後,我們組裝並呼叫這些匯出部件。

然後我們執行一下示例,就可以得到如下圖所示的結果:

很多人學習程式設計很喜歡直接ctrl + c別人的**,這是一種相當不好的學習方法,所以我把**都弄成截圖了,哈哈。

我事前在匯入字段宣告時用了lazy,但發現不能建立物件,可能的原因是我們匯出的是類的一部分,內部執行時在組裝部件時需要works類進行例項化,因為如果works物件不例項化的話,就導不出workfirst和worksecond屬性了。也許是這個原因導致的吧。

這時候大家可能會想,如果我在works類中定義乙個方法,我想匯出這個方法怎麼辦?

既然想到了還等什麼,馬上試試就知道了,我們把works類的**改一下,匯出乙個viewwork方法。

接著我們在program類中匯入這個方法。

匯入的協定名與協定型別一定要與匯出匹配,否則無法匯入。這就好比你的言行要匹配一樣,否則妹子不會理你。

在完成組裝的**後面,我們測試呼叫匯入的方法。

然後執行一下,看看有沒有結果。

不過,最後,還是把完整的**貼一下。

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.threading.tasks;

using

system.componentmodel.composition;

using

system.componentmodel.composition.hosting;

using

system.reflection;

namespace}

//第乙個實現公共介面的類

public

class

firstwork : iwork

public

string

wname}}

//第二個實現公共介面的類

public

class

secondwork : iwork

public

string

wname}}

//只對成員進行匯出的類

public

class

works //

該屬性被匯出

[export(

"work 1

", typeof

(iwork))]

public iwork workfirst } //

該屬性被匯出

[export(

"work 2

", typeof

(iwork))]

public

iwork worksecond}

//匯出方法

[export(

"view work

", typeof(func))]

public

string

viewwork()}

class

program

name: 呼叫結果:",

p.theimportfirstwork.gettype().name,

p.theimportfirstwork.wname);

p.theimportfirstwork.dosome();

}if (p.theimportsecondwork != null

) name: 呼叫結果:",

p.theimportsecondwork.gettype().name,

p.theimportsecondwork.wname);

p.theimportsecondwork.dosome();

}if (p.theimportviewworkmethod != null)

//釋容器以及其建立的例項

container.dispose();

console.read();}}

}

文章**:東邪獨孤

3 類成員的載入順序

初始化 給類的靜態變數賦值 在鏈結階段會賦預設值,主動使用這個類,才會初始化 在給靜態變數賦值時,是按照循序賦值的。並不是先給靜態 塊賦值。如果靜態欄位在靜態 塊 前,會先初始化靜態字段 當子類的成員變數可以在編譯期確定時,jvm是不會初始化這個類 即不是主動引用這個類 會將 這個常量加入 所使用該...

c 呼叫dll函式,匯出類中的成員函式

對於dll的操作,我們可以使用dumpbin檢視dll 和lib。注意寫好dll後 用depends檢視匯出函式時會發現匯出的函式名不是你寫的那樣出現所謂的亂碼入?等 這就注定dll不能通過顯示連線的方式匯入。如果想通過顯示連線的方式匯入可以為類新增乙個友元函式去實現顯示連線建立類得物件 這裡對於匯...

在C 范型程式設計中如何只特化類的某個成員函式

一 當模板類的某個引數為常量時,只特化類的某個成員函式 我們知道在c 模板程式設計中如果我們特化或是偏特化某個模板類,我們需要重寫整個模板類中的所有函式,但是這些 通常是非常相似的,甚至在某些情況下可能只有一兩個函式會不一樣,其他函式都是一樣的。在這種情況下,同時存在多份相同的 對我們維護這些 是非...