一、利用反射通过程序集名称和完整类型名称动态创建对象。
/// <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