關於跨程序集的反射(續)

以前曾寫過一篇“關於跨程序集的反射”的blog,關於跨程序集加載類型,文中使用的是方法是:先加載目標類型所在的程序集,再使用Assembly. GetType方法獲取類型。文後Luna兄的評論說,可以直接使用Type.GetType(“<<完全限定類名>>,<<程序集>>”)來加載類型,當初我查了MSDN,MSDN中也說到了這一點,我也就記住了這個解決方案。但是,今天使用這種方式來跨程序集進行類型加載時,卻始終返回null。難道MSDN有誤?我不知道。(還望知道的仁兄告知,呵呵)。

在Spring.net中,配置文件中,通常出現類似下面的配置項:


配置中的“type”的值正好與Type.GetType方法的參數格式完全一致,於是我猜想Spring.net是使用了Type.GetType方法。我查看了Spring.net這塊的源代碼,出乎意料的是Spring.net並沒有使用Type.GetType這個捷徑,而仍然使用了Assembly.GetType方法。也不知道爲什麼,呵呵

爲了以後使用方便,我自己封裝了一個靜態方法,來支持任意類型的加載。

1 #region GetType
2 // assemblyName 不用帶擴展名 ,如果目標類型在當前程序集中,assemblyName傳入null
3 public static Type GetType(string typeFullName ,string assemblyName)
4 {
5 if(assemblyName == null)
6 {
7 return Type.GetType(typeFullName) ;
8 }
9
10 //搜索當前域中已加載的程序集
11 Assembly[] asses = AppDomain.CurrentDomain.GetAssemblies();
12 foreach (Assembly ass in asses)
13 {
14 string[] names = ass.FullName.Split(‘,’) ;
15 if(names[0].Trim() == assemblyName.Trim())
16 {
17 return ass.GetType(typeFullName) ;
18 }
19 }
20
21 //加載目標程序集
22 Assembly tarAssem = Assembly.LoadWithPartialName(assemblyName) ;
23 if(tarAssem != null)
24 {
25 return tarAssem.GetType(typeFullName) ;
26 }
27
28 return null ;
29 }
30 #endregion

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章