首頁 > 後端開發 > C++ > 如何在 C# 中使用運行時確定的類型參數動態呼叫泛型方法?

如何在 C# 中使用運行時確定的類型參數動態呼叫泛型方法?

Barbara Streisand
發布: 2024-12-30 19:09:13
原創
618 人瀏覽過

How Can I Dynamically Invoke Generic Methods with Runtime-Determined Type Arguments in C#?

使用動態型別參數呼叫泛型方法

問題

在您的場景中,您想要迭代特定命名空間中的介面集合,並且動態地呼叫每個介面的通用方法。但是,由於編譯時的類型參數未知,您會遇到編譯時錯誤。

要動態呼叫具有運行時已知型別參數的泛型方法,可以使用反射,如下所示:

  1. 取得泛型方法資訊:使用Type.GetMethod方法檢索泛型方法定義。
  2. 產生泛型方法實例:在泛型方法定義上呼叫 MakeGenericMethod 方法來產生所需型別參數的特定方法實例。
  3. 呼叫泛型方法實例:使用Invoke方法呼叫產生的泛型方法實例,並帶有所需的內容

範例程式碼

using System;
using System.Linq;
using System.Reflection;

public class TestClass
{
    public static void CallGeneric<T>()
    {
        Console.WriteLine($"Generic type: {typeof(T)}");
    }

    public static void Main()
    {
        var assembly = Assembly.GetExecutingAssembly();

        var interfaces = assembly.GetTypes()
            .Where(t => t.Namespace == "MyNamespace.Interfaces");

        var genericMethod = typeof(TestClass).GetMethod("CallGeneric");

        foreach (var interfaceType in interfaces)
        {
            var genericMethodInstance = genericMethod.MakeGenericMethod(interfaceType);
            genericMethodInstance.Invoke(null, null); // No target or arguments needed
        }
    }
}
登入後複製

在此範例:

  • CallGeneric方法定義為列印泛型類型參數的泛型方法.
  • 我們從繼承自的特定命名空間中取得所有類型MyNamespace.Interfaces。
  • 我們使用反射來取得泛型方法 CallGeneric 並為每個介面類型建立一個泛型方法實例。
  • 我們呼叫泛型方法實例時不需要任何目標或參數,因為它是一個不帶任何參數的靜態方法。

以上是如何在 C# 中使用運行時確定的類型參數動態呼叫泛型方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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