反射(4)——Type反射

1、Activator.CreateInstance(Type t)会动态调用类的public无参构造函数创建一个对象,返回值就是创建的对象,如果类没有无参构造函数就会报错。

2、应用:动态创建对象SayHello。接口声明到单独的项目中,避免循环引用。 代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using 插件1接口;

namespace 插件1主程序
{
    class Program
    {
        static void Main(string[] args)
        {
            string s = @"D:\我的文档\快盘\传智资料\班级资料\2011年2月28日班\课上代码\Sln0410\插件1Chinese\bin\Debug\插件1Chinese.dll";
            Assembly asm = Assembly.LoadFile(s);
            //获得程序集中所有的public类
            Type[] types = asm.GetExportedTypes();//注意类要标注public
            Type type = types[0];//假定程序集中只有一个类
            //要求类库中只能定义一个public类,必须实现ISayHelloable接口
            //type.GetMethod("SayHello").GetMethodBody().GetILAsByteArray();
            object obj = Activator.CreateInstance(type);
            //因为主程序没有添加对Chinese的引用,所以不能直接转型为Chinese
            //但是因为Chinese实现了主程序也知道的ISayHelloable
            //所以可以转型为ISayHelloable调用。
            //主程序引用接口类库(注意是类库项目,不是控制台项目)、Chinese也引用接口类库,但是主程序没有直接引用Chinese
            ISayHelloable sayHelloable = (ISayHelloable)obj;
            //ISayHelloable sayHelloable = obj as ISayHelloable;
            //因为obj指向的是Chinese类的对象,而Chinese类实现了ISayHelloable接口
            //1、为什么不能也动态引用ISayHelloable的程序集:
            //因为那样就无法写代码的时候静态调用SayHello方法了
            //2、为什么不把ISayHelloable声明到主程序中。
            sayHelloable.SayHello();

            Console.ReadKey();
        }
    }
}

 

3、应用:通过配置文件动态创建对象

4、Type类的方法:

  • bool IsAssignableFrom(Type c):(直译:是否可以从c赋值)判断当前的类型的变量是不是可以接受c类型变量的赋值。IDbCommandsp; SqlCommandbsp; AccessSettingsProvider msp; sp可以从bsp、msp赋值(sp=bsp;sp=msp)。 bsp可以从msp赋值(bsp=msp)。
  • bool IsInstanceOfType(object o):判断对象o是否是当前类的实例(当前类可以是o的类、父类、接口)。
  • bool IsSubclassOf(Type c):判断当前类是否是类c的子类。类的事,没有接口的事。如果当前类是MemSettingsProvider,c是ISettingsProvider,则返回false。

 

5、类型:能声明变量的就是类型,比如类、委托、int、string,都属于类型。一个Main不能声明变量,所以Main不是类型。

6、反编译器其实也是靠反射来做的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值