c# 类反射(type.gettype/typeof)和实例化
来源:互联网 发布:灰色预测模型软件 编辑:程序博客网 时间:2024/05/18 02:27
在开发中,经常会遇到这种情况,在A.dll中需要反射B.dll中的类型,如果稍不注意,就会产生运行时错误。关于跨程序集的反射,记住两点就可以:
(1)如果使用typeof,编译能通过,则跨程序集的反射一定可以正常运行。可以说,typeof是支持强类型的。比如
Type supType = typeof(EnterpriseServerBase.DataAccess.IDBAccesser) ;
如果当前程序集没有添加对EnterpriseServerBase.dll的引用,则编译会报错。
(2)如果使用Type.GetType,情况就复杂些,这是因为Type.GetType是非强类型的。Type.GetType的参数是一个string,当string表示的目标类型不在当前程序集中,则运行时Type.GetType会返回null。解决的办法是:首先加载目标程序集,然后再使用Assembly.GetType方法。如
Assembly asmb = Assembly.LoadFrom("EnterpriseServerBase.dll") ;
Type supType = asmb.GetType("EnterpriseServerBase.DataAccess.IDBAccesser") ;
注意,当使用Type.GetType的时候,即使你添加了对EnterpriseServerBase.dll的引用,Type.GetType("EnterpriseServerBase.DataAccess.IDBAccesser")也会返回null,这是因为Type.GetType只会在当前程序集中进行类型搜索!
2个dll:a.dll,b.dll
如果 a要实例化 a中的一个对象 那么 Type.GetType(命名空间+类名) 就可以了.
如果a 中要实例化 b中的一个实例. 就没有那么简单了.
先要 进入 b的程序集.在去实例化.....
Type.GetType(ToReturn + "," + _MVCModelDll);
MVCModelDll:dll名称(不包括".dll")
ToReturn :命名空间和类名
如:Type type = Type.GetType("TestDLL.TestClass, TestDLL");
如果知道dll的名称就可以直接调用了.
如果不知道,就遍历的方式.
用遍历的方式
Assembly[] ass = AppDomain.CurrentDomain.GetAssemblies();//获取已经加载的所有程序集
foreach (Assembly assembly in ass)
{
if (string.IsNullOrEmpty(assembly.Location))
break;
string filename = System.IO.Path.GetFileName(assembly.Location);
string dolast = System.IO.Path.GetExtension(filename);
string _MVCModelDll = filename.Replace(dolast, "");
object basehelpertype = Type.GetType(ToReturn + "," + _MVCModelDll);
if (basehelpertype != null)//如果构建成功那肯定就是对的了...
break;
}
typeof 与 type.gettype区别:
1.
typeof:
用于获取类型的 system.type 对象。typeof 表达式采用以下形式:
system.type type = typeof(int);
gettype:
若要获取表达式的运行时类型,可以使用 .net framework 方法 gettype,如下所示:
int i = 0;
system.type type = i.gettype();
2.
a.gettype() 这个a是对象
typeof()是运算符而gettype是方法
gettype()是基类system.object的方法,因此只有建立一个实例之后才能够被调用(初始化以后)
typeof()的参数只能是int,string,string,自定义类型,且不能是实例
实例化
Assembly asmb = Assembly.LoadFrom("TestDLL.dll");
object intance = asmb.CreateInstance("TestDLL.TestClass");
- c# 类反射(type.gettype/typeof)和实例化
- c# 类反射(type.gettype/typeof)和实例化
- C#中使用typeof关键字和GetType()获取类的内部结构(反射机制)
- C# typeof 和 GetType区别
- C# typeof 和 GetType区别
- C# typeof() 和 GetType()区别
- C# typeof() 和 GetType()区别
- C# typeof() 和 GetType()区别
- C# typeof 和 GetType区别
- C# typeof() 和 GetType()区别
- C# typeof() 和 GetType()区别
- C# typeof() 和 GetType()区别
- C# typeof() 和 GetType()区别
- typeof与Type.GetType()
- Type.GetType()与 typeof跨程序集反射
- C# typeof() 和 GetType()区是什么?
- C#中的typeof()和GetType()的区别
- C#中的typeof()和GetType()的区别
- 【转载】Lucene学习笔记(八)--完
- [转] 请没有买房和买车的朋友一定认真的看...
- 国内各地图API坐标系统比较
- PHP 数组知识点
- Linux JDK卸载与安装
- c# 类反射(type.gettype/typeof)和实例化
- 汉字转换拼音或拼音首字母
- 第二次测验参考
- 程序员的学习和积累
- 简单说说用C#压缩资源以及FLASH中使用解压缩后的资源
- Tomcat和Hashtable 碰撞拒绝服务漏洞
- MiFare DesFire D40卡片因为安全原因停产了
- 男人的责任,你能做到吗?
- UML类图关系全面剖析