关于跨程序集的反射(续)

以前曾写过一篇“关于跨程序集的反射”的blog,关于跨程序集加载类型,文中使用的是方法是:先加载目标类型所在的程序集,再使用Assembly.GetType方法获取类型。文后Luna兄的评论说,可以直接使用Type.GetType("<<完全限定类名>>,<<程序集>>")来加载类型,当初我查了MSDN,MSDN中也说到了这一点,我也就记住了这个解决方案。但是,今天使用这种方式来跨程序集进行类型加载时,却始终返回null。难道MSDN有误?我不知道。(还望知道的仁兄告知,呵呵)。

在Spring.net中,配置文件中,通常出现类似下面的配置项:
< object name = " dataStreamHelper " type = " DataCenterBase.Common.DataStreamHelper,DataCenterBase " />
配置中的“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 TypeGetType( 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 (Assemblyass 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 AssemblytarAssem = Assembly.LoadWithPartialName(assemblyName);
23 if (tarAssem != null )
24 {
25 return tarAssem.GetType(typeFullName);
26 }
27
28 return null ;
29 }
30 #endregion

关于使用Type.GetType加载非当前程序集中的类型,谁有成功的经验了?感谢分享下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值