【C#】Invoke Method Using Reflection

  • 4418
  • 0

以前寫泛型,偶爾會遇到會有一個問題解不開。

呼叫時,依照不同參數給予不同的泛型型別。

這一層我一直沒有嘗試著去解開Switch Case 或是一堆If。

這次,獲得了一種解法,寫下來紀念這一刻。

先模擬著這次的情境。主要就是會去拿DB資料,資料的型別是泛型。

我會有一個Function(PrintData),會拿到這個可以決定泛型型別的字串。

以前很懶,一直用Switch Case來解決,雖然覺得醜,但又覺得無傷大雅。

        static void Main(string[] args)
        {
             PrintData("A");
        }

        private static void PrintData(string typeName)
        {
            switch (typeName)
            {
                case "A":
                    Console.WriteLine(GetData<TestA>().GetType());
                    break;
                case "B":
                    Console.WriteLine(GetData<TestB>().GetType());
                    break;
            }
        }

        private static List<T> GetData<T>()
        {
            return new List<T>(); 
        }

這是模擬舊的方式。當類別越來越多,臭味越來越濃烈。

調整後:

        static void Main(string[] args)
        {
            PrintDataNew("TestA");
            //PrintData("A");
        }

        private static void PrintDataNew(string typeName)
        {
            var refType = Type.GetType("InvokeMethod." + typeName);
            var instance = new Program();
            var method = typeof(Program).GetMethod("GetData");
            var methodInfo = method.MakeGenericMethod(refType);
            Console.WriteLine(methodInfo.Invoke(instance, null));
        }

如此,未來怎麼擴充都更有彈性了!!