反射

一、利用反射通过程序集名称和完整类型名称动态创建对象。

/// <summary>
/// 利用反射创建对象。
/// </summary>
/// <param name="assemblyFullName">程序集完整名称</param>
/// <param name="classFullName">类完整名称</param>
/// <param name="args">对象构造初始参数</param>
/// <returns></returns>
public static object CreateObject(string assemblyFullName, string classFullName, object[] args)
{
Assembly _assembly = Assembly.Load(assemblyFullName);
Type _type = _assembly.GetType(classFullName, false);
if (null != _type)
return Activator.CreateInstance(_type, args);

return null;
}

            #region 使用无参构造函数创建对象

            //使用无参构造函数创建对象1
            Assembly asm = Assembly.GetExecutingAssembly();
            object obj = asm.CreateInstance("WebApplication.TestClass");

            //使用无参构造函数创建对象2
            ObjectHandle handler = Activator.CreateInstance(null, "WebApplication.TestClass");
            //CreateInstance 第一个参数为程序集名称,为null 表示当前程序集,第二个参数表示要创建的类型  
            Object obj1 = handler.Unwrap();
            //打印:这是一个无参构造函数  

            #endregion

            #region 使用有参数构造函数创建对象

            object[] args =new object[2];
            args[0] = 10;
            args[1] = 20;
            Assembly asm2 = Assembly.GetExecutingAssembly();
            object obj2 = asm2.CreateInstance("WebApplication.TestClass", true, BindingFlags.Default, null, args, null,null);

            #endregion



            #region 动态调用方法:使用InvokeMember调用方法

            Response.Write("========================== 使用InvokeMember调用方法=====================<br>");

            //动态调用无参数方法  
             Type t = typeof(TestClass);  
             TestClass ts=new TestClass (1,2);
             Response.Write("<br>");
             int result = (int)t.InvokeMember("show", BindingFlags.InvokeMethod,null,ts,null);  
             Response.Write(result);
             Response.Write("<br>");

             //动态调用有参静态方法  
             Type t1 = typeof(TestClass);
             int result1 = (int)t1.InvokeMember("show", BindingFlags.InvokeMethod, null, t1, args);
             Response.Write(result1);
             Response.Write("<br>");

            #endregion

            #region 使用MethodInfo.Invoke调用方法

             Response.Write("========================== 使用MethodInfo.Invoke调用方法=====================<br>");

               Type t2 = typeof(TestClass);  
               TestClass ts2 = new TestClass();  
               MethodInfo mi = t2.GetMethod("show",BindingFlags.Instance|BindingFlags.Public);  
               int result2=(int)mi.Invoke(ts2, null);
               Response.Write(result2);
               Response.Write("<br>");
  
               Type t3 = typeof(TestClass);  
               MethodInfo mi1 = t3.GetMethod("show",BindingFlags.Static|BindingFlags.Public);  
               int result3 = (int)mi1.Invoke(null, args);  
               Console.WriteLine(result3); 

            #endregion
原文地址:https://www.cnblogs.com/lxf1117/p/4779283.html