天天看点

C#动态创建实例创建的API主要就是以下两个

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();
			//结果与第一种方法相同。
		}
	}
}


           

在这里简单的介绍了两种方法,主要用于工厂模式中的应用,关于反射的原理我抽空补上(能够想起来的话。。)