在呼叫執行時決定類型的泛型方法
嘗試呼叫編譯時類型參數未知的泛型方法時會出現此問題。普通方法呼叫依賴編譯器執行的類型安全檢查,但是當類型僅在執行時可用時,需要替代方法。
基於反射的解決方案
在提供的程式碼範例的上下文中:
public void Method<T>() where T : class {} public void AnotherMethod() { ... foreach (var interface in interfaces) { Method<interface>(); // Compile error! } }
繞過編譯時類型檢查:
使用Type.GetMethod擷取開放泛型方法:
MethodInfo method = typeof(Test).GetMethod("Method");
將方法泛型與MakeGenericMethod:
MethodInfo genericMethod = method.MakeGenericMethod(interface);
:
genericMethod.Invoke(null, null); // No target or arguments in this case
:
使用Invokeusing System; using System.Linq; using System.Reflection; namespace Sample { interface IFoo { } interface IBar { } class Program { public static void CallMe<T>() { Console.WriteLine("Type of T: {0}", typeof(T)); } static void Main() { var types = typeof(Program).Assembly.GetTypes().Where(t => t.Namespace == "Sample"); var methodInfo = typeof(Program).GetMethod("CallMe"); foreach (var type in types) { var genericMethodInfo = methodInfo.MakeGenericMethod(type); genericMethodInfo.Invoke(null, null); } } } }
:
完全的範例為了闡明這個過程,請考慮此修訂後的程式碼範例: 在此範例中,根據Sample 命名空間中找到的類型動態呼叫通用CallMe 方法.以上是如何呼叫具有運行時確定類型的泛型方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!