使用C#反射中的MakeGenericType函數,來爲泛型方法和泛型類指定(泛型的)類型

C#反射中的MakeGenericType函數可以用來指定泛型方法和泛型類的具體類型,方法如下面代碼所示這裏就不多講了,詳情看下面代碼一切就清楚了:

using System;
using System.Reflection;

namespace RFTest
{
    //類ReflectionTest中定義了一個泛型函數DisplayType和泛型類MyGenericClass
    class ReflectionTest
    {
        //泛型類MyGenericClass有個靜態函數DisplayNestedType
        public class MyGenericClass<T>
        {
            public static void DisplayNestedType()
            {
                Console.WriteLine(typeof(T).ToString());
            }
        }

        public void DisplayType<T>()
        {
            Console.WriteLine(typeof(T).ToString());
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            ReflectionTest rt = new ReflectionTest();

            MethodInfo mi = rt.GetType().GetMethod("DisplayType");//先獲取到DisplayType<T>的MethodInfo反射對象
            mi.MakeGenericMethod(new Type[] { typeof(string) }).Invoke(rt, null);//然後使用MethodInfo反射對象調用ReflectionTest類的DisplayType<T>方法,這時要使用MethodInfo的MakeGenericMethod函數指定函數DisplayType<T>的泛型類型T

            Type myGenericClassType = rt.GetType().GetNestedType("MyGenericClass`1");//這裏獲取MyGenericClass<T>的Type對象,注意GetNestedType方法的參數要用MyGenericClass`1這種格式才能獲得MyGenericClass<T>的Type對象
            myGenericClassType.MakeGenericType(new Type[] { typeof(float) }).GetMethod("DisplayNestedType", BindingFlags.Static | BindingFlags.Public).Invoke(null, null);
            //然後用Type對象的MakeGenericType函數爲泛型類MyGenericClass<T>指定泛型T的類型,比如上面我們就用MakeGenericType函數將MyGenericClass<T>指定爲了MyGenericClass<float>,然後繼續用反射調用MyGenericClass<T>的DisplayNestedType靜態方法

            Console.ReadLine();
        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章