.NET反射學習總結2
阿新 • • 發佈:2021-01-10
已知程式集名稱和型別名稱建立反射物件後,直接呼叫方法的常見形式:
建立一個反射測試類:
using System; namespace DB.MySql { /// <summary> /// 反射測試類 /// </summary> public class FlectionTest { /// <summary> /// 建構函式 /// </summary> public FlectionTest() { Console.WriteLine("這裡是{0}無參建構函式", this.GetType()); } /// <summary> /// 無參方法 /// </summary> public void Show1() { Console.WriteLine("這裡是{0}的show1", this.GetType()); } /// <summary> /// 有參方法 /// </summary> public void Show2(int id) { Console.WriteLine("這裡是{0}的show2,實參id值為:{1}", this.GetType(), id); } /// <summary> /// 過載方法1 /// </summary> /// <param name="id"></param> /// <param name="name"></param> public void Show3(int id, string name) { Console.WriteLine("這裡是{0}的show3_1", this.GetType()); } /// <summary> /// 過載方法2 /// </summary> /// <param name="name"></param> /// <param name="id"></param> public void Show3(string name, int id) { Console.WriteLine("這裡是{0}的show3_2", this.GetType()); } /// <summary> /// 過載方法3 /// </summary> /// <param name="id"></param> public void Show3(int id) { Console.WriteLine("這裡是{0}的show3_3", this.GetType()); } /// <summary> /// 過載方法4 /// </summary> /// <param name="name"></param> public void Show3(string name) { Console.WriteLine("這裡是{0}的show3_4", this.GetType()); } /// <summary> /// 過載方法5 /// </summary> public void Show3() { Console.WriteLine("這裡是{0}的show3_5", this.GetType()); } /// <summary> /// 私有方法 /// </summary> private void Show4(string name) { Console.WriteLine("這裡是{0}的私有方法show4", this.GetType()); } /// <summary> /// 靜態方法 /// </summary> /// <param name="name"></param> public static void Show5(string name) { Console.WriteLine("這裡是{0}的靜態方法show5", typeof(FlectionTest)); } /// <summary> /// 泛型方法 /// </summary> /// <typeparam name="T"></typeparam> /// <typeparam name="W"></typeparam> /// <typeparam name="X"></typeparam> /// <param name="t"></param> /// <param name="w"></param> /// <param name="x"></param> public string Show6<T, W, X>(T t, W w, X x) { Console.WriteLine("泛型方法測試:t.type={0},w.type={1},x.type={2}", t.GetType().Name, w.GetType().Name, x.GetType().Name); return "我是泛型方法的返回值字串"; } } }
建立例項物件:
Assembly assembly = Assembly.Load("DB.MySql");//程式集的名稱
Type type = assembly.GetType("DB.MySql.FlectionTest");//獲取型別
object oTest = Activator.CreateInstance(type);//建立物件
呼叫無參方法:
MethodInfo info1 = type.GetMethod("Show1");
info1.Invoke(oTest, null);
呼叫有參方法:
MethodInfo info2 = type.GetMethod("Show2"); info2.Invoke(oTest, new object[] { 111 });
呼叫過載方法:
MethodInfo info3_1 = type.GetMethod("Show3", new Type[] { typeof(int), typeof(string) }); info3_1.Invoke(oTest, new object[] { 20, "張三" }); MethodInfo info3_2 = type.GetMethod("Show3", new Type[] { typeof(string), typeof(int) }); info3_2.Invoke(oTest, new object[] { "李四", 25 }); MethodInfo info3_3 = type.GetMethod("Show3", new Type[] { typeof(int) }); info3_3.Invoke(oTest, new object[] { 66 }); MethodInfo info3_4 = type.GetMethod("Show3", new Type[] { typeof(string) }); info3_4.Invoke(oTest, new object[] { "測試文字" }); MethodInfo info3_5 = type.GetMethod("Show3", new Type[] { }); info3_5.Invoke(oTest, null);
呼叫私有方法:
MethodInfo info4 = type.GetMethod("Show4", BindingFlags.Instance | BindingFlags.NonPublic);
info4.Invoke(oTest, new object[] { "私有方法引數" });
呼叫靜態方法:
MethodInfo info5_1 = type.GetMethod("Show5");
info5_1.Invoke(oTest, new object[] { "引數1" });//呼叫靜態方法可以傳遞例項
MethodInfo info5_2 = type.GetMethod("Show5");
info5_2.Invoke(null, new object[] { "引數2" }); //呼叫靜態方法可以不傳遞例項
呼叫泛型方法:
MethodInfo info6 = type.GetMethod("Show6");
var methodNew = info6.MakeGenericMethod(new Type[] { typeof(int), typeof(string), typeof(DateTime) });
object oReturn = methodNew.Invoke(oTest, new object[] { 2333, "泛型引數", DateTime.Now });
Console.WriteLine(oReturn.ToString());
泛型類+泛型方法:
建立一個泛型測試類:泛型類引數T,泛型方法引數T,W,X,方法中的引數T 來源於類引數
using System;
namespace DB.MySql
{
public class GenericDouble<T>
{
public void Show<W, X>(T t, W w, X x)
{
Console.WriteLine("泛型類測試:t.type={0},w.type={1},x.type={2}", t.GetType().Name, w.GetType().Name, x.GetType().Name);
}
}
}
呼叫:
Assembly assembly1 = Assembly.Load("DB.MySql");//程式集的名稱
Type type1 = assembly1.GetType("DB.MySql.GenericDouble`1").MakeGenericType(typeof(int));//獲取型別
object oObject = Activator.CreateInstance(type1);//建立物件
MethodInfo methodInfo = type1.GetMethod("Show").MakeGenericMethod(typeof(string), typeof(DateTime));
methodInfo.Invoke(oObject, new object[] { 666, "加油", DateTime.Now });