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(a) 这个a是类型
typeof()是运算符而gettype是方法
gettype()是基类system.object的方法,因此只有建立一个实例之后才能够被调用(初始化以后)
typeof()的参数只能是int,string,string,自定义类型,且不能是实例

实例化

Assembly asmb = Assembly.LoadFrom("TestDLL.dll");

object intance = asmb.CreateInstance("TestDLL.TestClass");

原创粉丝点击