类库探源——System.Type

时间:2023-03-10 07:19:23
类库探源——System.Type

一、MSDN 描述

Type 类:表示类型声明:类类型、接口类型、数组类型、值类型、枚举类型、类型参数、泛型类型定义、以及开放或封闭构造的泛型类型。

命名空间: System

程序集:mscorlib.dll

继承关系:

类库探源——System.Type

从上面的继承关系能看出,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类图如下:

类库探源——System.Type

上面的 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");
}
}
}