zoukankan      html  css  js  c++  java
  • C#

    使用配置文件和反射来创建对象实例

    为了增加程序的可扩展性,提高可配置性,常常需要使用配置文件+反射来动态调用方法。

    下面定义的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);
    
    }

    执行结果:

  • 相关阅读:
    洛谷 P1219 八皇后【经典DFS,温习搜索】
    洛谷 P1972 [SDOI2009]HH的项链【莫队算法学习】
    hihoCoder #1015 : KMP算法【KMP裸题,板子】
    UVa 10341
    UVa 11461
    Uva
    BZOJ 3097: Hash Killer I【构造题,思维题】
    BZOJ 1207: [HNOI2004]打鼹鼠【妥妥的n^2爆搜,dp】
    BZOJ 1800: [Ahoi2009]fly 飞行棋【思维题,n^4大暴力】
    新版百度指数2013-12-23正式上线
  • 原文地址:https://www.cnblogs.com/tcli/p/6918654.html
Copyright © 2011-2022 走看看