以前寫泛型,偶爾會遇到會有一個問題解不開。
呼叫時,依照不同參數給予不同的泛型型別。
這一層我一直沒有嘗試著去解開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));
}
- 透過Type.GetTye取得泛型類別的Type型別(注意NameSpace)。
- 將Function歸屬的Class 建立執行個體
- 透過.GetMethod 取得要執行的Method
- 因為這個方法是泛型方法,所以,透過.MakeGenericMethod 取得 MethodInfo 類別
- 最後透過MethodBase.Invoke 觸發Function 執行
如此,未來怎麼擴充都更有彈性了!!