反射(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...