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、反编译器其实也是靠反射来做的。