C 反射的Assembly的簡單應用

2021-07-22 09:54:42 字數 4546 閱讀 4080

反射(reflection)是.net中的重要機制,通過反射,可以在執行時獲得.net中每乙個型別(包括類、結構、委託、介面和列舉等)的成員,包括方法、屬性、事件,以及建構函式等。還可以獲得每個成員的名稱、限定符和引數等。有了反射,即可對每乙個型別瞭如指掌。如果獲得了建構函式的資訊,即可直接建立物件,即使這個物件的型別在編譯時還不知道。

assembly就是反應反射的一種應用,它定義和引導程式集,載入在程式集清單中列出模組,以及從此程式集中查詢型別並建立該型別的例項。簡單地說就是,使用assembly在程式中你不用事先寫比如下面的東西了:

[csharp]view plain

copy

print?

personclass person = 

newpersonclass();  

person.method();  

你只要知道personclass這個類的程式集,命名空間和類名直接使用反射就可以使用。你只需要這樣寫:

[html]view plain

copy

print?

personclass person;  

person

=   

person

= (personclass)(assembly.load("程式集").createinstance("命名空間.類名", false, bindingflags.default, null, args, null, null));  

person.method();  

下面用乙個小例子來看看assembly應用的方便性。

需求:有幾種檔案格式,字尾分別是.one,.two,.three,... 有很多種,後續還可能增加。這些檔案的格式都不一樣,也就是說讀取方式就不一樣。那麼根據傳入的檔案字尾和路徑讀出檔案的內容。

實現:這種需求的特點是,根據選擇做不同的處理,但是都是出的一種結果,那麼可以使用簡單工廠模式來完成。

讀取檔案有乙個父類filesuper,內部如下:

[csharp]view plain

copy

print?

using

system;  

using

system.collections.generic;  

using

system.text;  

namespace

reflect  

}  分別有myfileone,myfiletwo,myfilethree等,繼承filesuper,如下:

[csharp]view plain

copy

print?

using

system;  

using

system.collections.generic;  

using

system.text;  

namespace

reflect  

}  }  

[csharp]view plain

copy

print?

using

system;  

using

system.collections.generic;  

using

system.text;  

namespace

reflect  

}  }  

[csharp]view plain

copy

print?

using

system;  

using

system.collections.generic;  

using

system.text;  

namespace

reflect  

}  }  

乙個工廠類根據字尾名決定例項化哪個類:

[csharp]view plain

copy

print?

using

system;  

using

system.collections.generic;  

using

system.text;  

namespace

reflect  

if(filesuper != 

null

)    

return

"沒有指定的型別"

;  }  

}  }  

客戶端呼叫,顯示結果:

[csharp]view plain

copy

print?

using

system;  

using

system.collections.generic;  

using

system.text;  

namespace

reflect  

}  }  

這樣解決了這個需求,前面在讀書筆記6:工廠方法模式

中提到了這種方式的缺點,就是不符合開放封閉原則,那麼如何改進了,除了工廠方法模式,我們可以使用assembly。使用它之前,要先寫乙個類和乙個配置檔案。

先看配置檔案:myfile.xml

[html]view plain

copy

print?

xmlversion

="1.0"

encoding

="utf-8"

?>

<

fileextendname

>

<

extend

>

<

name

>

onename

>

<

class

>

myfileone

class

>

extend

>

<

extend

>

<

name

>

twoname

>

<

class

>

myfiletwo

class

>

extend

>

<

extend

>

<

name

>

three

name

>

<

class

>

myfilethree

class

>

extend

>

fileextendname

>

是字尾名和類名的對應。

另乙個讀取配置檔案的類extendnamedatatable。

[csharp]view plain

copy

print?

using

system;  

using

system.collections.generic;  

using

system.text;  

using

system.data;  

namespace

reflect  

return

extenddataset;  

}  }  

}  }  

做好這兩個準備後,只需修改operationfile工廠類,其餘都不用修改。使用assembly來根據配置檔案,自動按照傳入的字尾名載入類,並且例項化,修改後的operationfile如下:

[csharp]view plain

copy

print?

using

system;  

using

system.collections.generic;  

using

system.text;  

using

system.data;  

using

system.reflection;  

namespace

reflect  

}  }  

客戶端呼叫不變輸出結果:

我們看到,這樣一來,如果有了新的檔案結構,只需要再寫乙個myfilefour類繼承自filesuper;然後再在myfile.xml中增加相應的對應關係就可以了,避免了要修改operationfile的case分支,符合開放封閉原則。

當然assembly這麼好使用,也不是所有情況下都能用的,當在迴圈中碰到了這種情況,那麼還是使用簡單工廠模式或者工廠方法模式吧,因為再迴圈中使用assembly例項化會導致效能下降。

C 反射的Assembly的簡單應用

反射 reflection 是.net中的重要機制,通過反射,可以在執行時獲得.net中每乙個型別 包括類 結構 委託 介面和列舉等 的成員,包括方法 屬性 事件,以及建構函式等。還可以獲得每個成員的名稱 限定符和引數等。有了反射,即可對每乙個型別瞭如指掌。如果獲得了建構函式的資訊,即可直接建立物件...

C 反射Assembly 具體說明

1 對c 反射機制的理解 2 概念理解後,必須找到方法去完畢,給出管理的主要語法 3 終於給出有用的樣例,反射出來dll中的方法 反射是乙個程式集發現及執行的過程,通過反射能夠得到 exe或 dll等程式集內部的資訊。使用反射能夠看到乙個程式集內部的介面 類 方法 字段 屬性 特性等等資訊。在sys...

C 反射Assembly 具體說明

1 對c 反射機制的理解 2 概念理解後,必須找到方法去完畢,給出管理的主要語法 3 終於給出有用的樣例,反射出來dll中的方法 反射是乙個程式集發現及執行的過程,通過反射能夠得到 exe或 dll等程式集內部的資訊。使用反射能夠看到乙個程式集內部的介面 類 方法 字段 屬性 特性等等資訊。在sys...