C#通过反射获取不同命名空间下的类(属性和方法)

怎么通过反射获取多层命名空间下的类啊,试了好多次都报错,求大神解决!!!... 怎么通过反射获取多层命名空间下的类啊,试了好多次都报错,求大神解决!!! 展开
 我来答
makosharp
推荐于2017-09-29 · TA获得超过676个赞
知道小有建树答主
回答量:188
采纳率:100%
帮助的人:269万
展开全部

请注意看异常信息。未能从“当前”程序集获取“外部”程序集中拥有指定完整限定名的类型。

事实上,直接使用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)

该静态方法要求你提供自己的程序集名称解析器和类型名称解析器,非特殊情况不推荐使用。该方法是为了在多个程序集中同时查找多个类型而被微软提供的。

超大蒲公英
2014-10-24 · TA获得超过741个赞
知道小有建树答主
回答量:758
采纳率:75%
帮助的人:740万
展开全部
如果你只给出了类的完全名称(名称空间+类型),则只能获取当前程序集,和Mscorlib中的类型。
如果类型在其它程序集,就要加上程序集名称。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
阳光的雷咩咩
2014-10-23 · TA获得超过1.4万个赞
知道大有可为答主
回答量:2.3万
采纳率:66%
帮助的人:7803万
展开全部
先新建一个项目,把那个dll引用进来,然后在视图-对象浏览器里面看你想反射的对象到底是什么层次结构。
追问
这些都引用进来了,层次结构大概包了三个命名空间。直接去获取类名就报错。
追答
口说无凭,把上面我说的对象浏览器相关部分截图来看。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式