使用配置文件和反射来创建对象实例
为了增加程序的可扩展性,提高可配置性,常常需要使用配置文件+反射来动态调用方法。
下面定义的SIT类包含一个接口方法,演示如何使用配置文件及反射来动态调用。
using System; namespace ConsoleApp1.CRMDataHandler { public class SIT : CRMDataHandler, IIncident { public void CreateIncident() { Console.WriteLine("{0} CreateIncident", this.GetType()); } } }
配置文件如下:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="ClassName" value="ConsoleApp1.CRMDataHandler.SIT" /> <add key="MethodName" value="CreateIncident" /> </appSettings> </configuration>
实例化代码,两种方式创建实例化对象:
/// <summary> /// 使用Activator创建对象实例 /// </summary> public static void CreatedByActivator() { string typeName = ConfigurationManager.AppSettings.Get("ClassName"); string methodName = ConfigurationManager.AppSettings.Get("MethodName"); Type t = Type.GetType(typeName); object instance = Activator.CreateInstance(t); //创建实例 //object result = t.InvokeMember(methodName, BindingFlags.InvokeMethod // , null, instance, null); //调用方法 t.GetMethod(methodName).Invoke(instance, null); } /// <summary> /// 使用构造函数创建对象实例 /// </summary> public static void CreatedByConstructor() { string typeName = ConfigurationManager.AppSettings.Get("ClassName"); string methodName = ConfigurationManager.AppSettings.Get("MethodName"); Type t = Type.GetType(typeName); ConstructorInfo ci = t.GetConstructor(new Type[] { }); object instance = ci.Invoke(null); t.GetMethod(methodName).Invoke(instance, null); //object result = t.InvokeMember(methodName, BindingFlags.InvokeMethod, null, instance, null); }
执行结果: