1. 程式人生 > 其它 >.NET反射學習總結2

.NET反射學習總結2

技術標籤:c#.net反射c#

已知程式集名稱和型別名稱建立反射物件後,直接呼叫方法的常見形式:

建立一個反射測試類:

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 });