使用配置文件和反射來創建對象實例
為了增加程序的可擴展性,提高可配置性,常常需要使用配置文件+反射來動態調用方法。
下面定義的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); }
執行結果:

