
一、MSDN 描述
Type 类:表示类型声明:类类型、接口类型、数组类型、值类型、枚举类型、类型参数、泛型类型定义、以及开放或封闭构造的泛型类型。
命名空间: System
程序集:mscorlib.dll
继承关系:
从上面的继承关系能看出,Type和反射有关系,的确,引用MSDN上的话Type 为 System.Relection 功能的根也是访问元数组的主要方式。
二、获取 Type 的几种方式:
1. typeof 运算符
var type1 = typeof(TypeName);
如
var intType = typeof(int);
2. Type.GetType(string TypeName) 方法
注意 TypeName 必须是 AssemblyQualifiedName ,即类型的程序限定名由程序的名称(包括了类型的命名空间)加上一个逗号再加上程序集的显示名称组成。 var typeName = @"ImplA.ClassFunc,ImplA";
var typeImplA = Type.GetType(typeName);
3. ObjectInstance.GetType();
Console.WriteLine(.GetType());
上面3种方法,最常用的是第二种,其次是第一种,然后是第三种
三、简单的类加载器
UML类图如下:
上面的 4个类(接口)分别在单独的程序集中
IFuction 位于 Common.dll
namespace Common
{
public interface IFuction
{
void Init(string initConfig); void Open(); void Close(); void Dispose();
}
}
Loader 位于 App.exe
using System;
class App
{
static void Main()
{
LoadPlugin();
} static void LoadPlugin()
{
// 读取xml配置,目前为了代码简单化写死
var strA = @"ImplA.ClassFunc,ImplA";
var strB = @"ImplB.ClassFunc,ImplB"; var instanceA = Activator.CreateInstance(Type.GetType(strA)) as IFuction;
var instanceB = Activator.CreateInstance(Type.GetType(strB)) as IFuction; instanceA.Init(null);
instanceA.Open(); instanceB.Init(null);
instanceB.Open();
}
}
ClassFunc 位于 ImplA.dll
using System;
using Common; namespace ImplA
{
public class ClassFunc : IFuction
{ public void Init(string initConfig)
{
Console.WriteLine("ImplA.ClassFunc.Init");
} public void Open()
{
Console.WriteLine("ImplA.ClassFunc.Open");
} public void Close()
{
Console.WriteLine("ImplA.ClassFunc.Close");
} public void Dispose()
{
Console.WriteLine("ImplA.ClassFunc.Dispose");
}
}
}
ClassFunc 位于 ImplB.dll
using System;
using Common; namespace ImplB
{
public class ClassFunc : IFuction
{ public void Init(string initConfig)
{
Console.WriteLine("ImplB.ClassFunc.Init");
} public void Open()
{
Console.WriteLine("ImplB.ClassFunc.Open");
} public void Close()
{
Console.WriteLine("ImplB.ClassFunc.Close");
} public void Dispose()
{
Console.WriteLine("ImplB.ClassFunc.Dispose");
}
}
}