c# 类反射(type.gettype/typeof)和实例化

在开发中,经常会遇到这种情况,在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");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值