C#通过反射获取不同命名空间下的类(属性和方法)
请注意看异常信息。未能从“当前”程序集获取“外部”程序集中拥有指定完整限定名的类型。
事实上,直接使用Type.GetType()会从当前程序集,也就是"test3"程序集中查找。
想要查找NHapi.Model.V23程序集中的类型,请在该程序集上使用GetType.
Assembly asmNHapi=Assembly.LoadFrom(.....);
Type outerType=asmNHapi.GetType(............);
如果想尽量少的改动自己的代码也成,直接在你的var classes上进行linq查询就好。
Type[] classes=Assembly.LoadFrom(...).GetTypes();
Type tt=classes.FirstOrDefault(t=>t.FullName="NHapi.Model.V23.Group.ORM_001_"+properties[i]);
if(tt!=null)
DoSomething();
最后提醒,请勿使用Assembly.Load方法,因为该方法已被弃用,请使用LoadFrom和LoadFile来加载外部程序集。
此外,类型的完全限定名和短名并不影响类型的搜索。使用GetType时会从根命名空间开始一层一层查找的,如果各层命名空间下没有重名的类,你甚至没有使用完全限定名的必要。比如上面的代码里可以使用短名进行查找。
Type tt=classes.FirstOrDefault(t=>t.Name="ORM_001_"+properties[i]);
刚看到上面的回答,这里我要肯定的告诉你,不管你是用文件方式还是项目引用方式,都不可能使用Type.GetType静态方法获取另一个程序集中的类型,必须在对方的程序集上进行查找!
如果你非要使用Type.GetType静态方法获取其他程序集中的类型,可以使用其的一种重载:
public static System.Type GetType(string typeName, System.Func<AssemblyName,Assembly> assemblyResolver, System.Func<Assembly,string,bool,Type> typeResolver)
该静态方法要求你提供自己的程序集名称解析器和类型名称解析器,非特殊情况不推荐使用。该方法是为了在多个程序集中同时查找多个类型而被微软提供的。
如果类型在其它程序集,就要加上程序集名称。
这些都引用进来了,层次结构大概包了三个命名空间。直接去获取类名就报错。
口说无凭,把上面我说的对象浏览器相关部分截图来看。