关于跨程序集的反射(续)
2016-05-09 15:55
183 查看
以前曾写过一篇“关于跨程序集的反射”的blog,关于跨程序集加载类型,文中使用的是方法是:先加载目标类型所在的程序集,再使用Assembly. GetType方法获取类型。文后Luna兄的评论说,可以直接使用Type.GetType(“<<完全限定类名>>,<<程序集>>”)来加载类型,当初我查了MSDN,MSDN中也说到了这一点,我也就记住了这个解决方案。但是,今天使用这种方式来跨程序集进行类型加载时,却始终返回null。难道MSDN有误?我不知道。(还望知道的仁兄告知,呵呵)。
配置中的“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
在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
相关文章推荐
- php模块化供前端ajax调用的实现
- (2.1.19.5)深入理解Java:注解(Annotation)--注解处理器
- Android 实现一键切换应用主题颜色
- CUGOJ 1681 求解最长回文字符串
- ubuntu安装卸载和查看已安装软件
- Android通过Get方式提交数据的乱码处理
- MySQL学习9:详解MySQL中的外键约束
- 某些情况下 push pop动画失效的处理
- java验证码组件Jcaptcha
- JobConf
- 用脚本 打开文件 并打印内容
- Android 沉浸式状态栏攻略 让你的状态栏变色吧
- 【转】javascript中top、clientTop、scrollTop、offsetTop的讲解
- 北京大学CMA—让CMA考试更简单
- python sort()方法
- SpringMVC简介与配置
- Fib && 组合数
- NSHashTable和NSMapTable用法
- 奴隶主谜题,何解?
- navigation的Title和TabBar的Title不同时怎么解决