首頁 > 後端開發 > C++ > 如何呼叫具有運行時確定類型的泛型方法?

如何呼叫具有運行時確定類型的泛型方法?

Linda Hamilton
發布: 2024-12-30 14:53:16
原創
1006 人瀏覽過

How Can I Call Generic Methods with Runtime-Determined Types?

在呼叫執行時決定類型的泛型方法

嘗試呼叫編譯時類型參數未知的泛型方法時會出現此問題。普通方法呼叫依賴編譯器執行的類型安全檢查,但是當類型僅在執行時可用時,需要替代方法。

基於反射的解決方案

在提供的程式碼範例的上下文中:

public void Method<T>() where T : class {}
public void AnotherMethod()
{
    ...
    foreach (var interface in interfaces)
    {
        Method<interface>(); // Compile error!
    }
}
登入後複製

繞過編譯時類型檢查:

  1. 使用Type.GetMethod擷取開放泛型方法

    MethodInfo method = typeof(Test).GetMethod("Method");
    登入後複製
  2. 將方法泛型與MakeGenericMethod:

    MethodInfo genericMethod = method.MakeGenericMethod(interface);
    登入後複製
  3. :

    :
    genericMethod.Invoke(null, null); // No target or arguments in this case
    登入後複製

:

使用Invoke
using 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板