C#中的动态创建实例依赖的是反射机制,通俗点来说就是通过字符串类型的命名空间与类名来找到该类。从而对该类进行一系列的操作。
(只介绍两种常用的方法,有很多重载,大家可以自己尝试)
创建的API主要就是以下两个
直接上代码
首先准备一个被映射找到的类
//在ReflectTest命名空间下,准备一个要被反射找到的类TestClass
using System;
namespace ReflectTest
{
class TestClass
{
public void TestMethod()
{
Console.WriteLine("测试成功");
}
}
}
System.Activator.CreateInstance()
使用CreateInstance静态方法进行创建。
//Main方法
//如果想要反射当前命名空间下的类时,与此方法相同,不同之处在于不用引用反射类所在的命名空间。
using System;
using System.Reflection;
using ReflectTest;
namespace ReflectTesting
{
class Program
{
static void Main()
{
//找到TestClass类型
Type type=Type.GetType("ReflectTest.TestClass");
//通过CreateInstance创建实例
TestClass testClass=(TestClass)Activator.CreateInstance(type);
//调用方法
testClass.TestMethod();
}
}
}
System.Reflection.Assembly.CreateInstance()
这里的CreateInstance方法为非静态的方法,所以需要一个Assembly的实例。Assembly学名为程序集,官方介绍为代码进行编译时的一个逻辑单元。
关于Assembly在这里就不多做介绍了,可以简单理解为包含者该工程内的namespace的集合,实例可以通过Type类型的实例点Assembly点出来。
主要介绍一下第二种动态实例
//继续动态实例上个方法中的ReflectTest下的TestClass
using System;
using System.Reflection;
using ReflectTest;
namespace ReflectTesting
{
class Program
{
static void Main()
{
//获取Assembly的方法有很多种,这里就只介绍两种。
Assembly assembly;
//1.
assembly=Type.GetType("ReflectTest.TestClass").Assembly;
//2.
assembly=Assembly.Load("ReflectTest");//注意这里Load中填写的是程序集的名字,不一定和命名空间的名字相同。
TestClass testClass=(TestClass) assembly.CreateInstance("ReflectTest.TestClass");
testClass.TestMethod();
//结果与第一种方法相同。
}
}
}
在这里简单的介绍了两种方法,主要用于工厂模式中的应用,关于反射的原理我抽空补上(能够想起来的话。。)