ホームページ >バックエンド開発 >C++ >C# で実行時に決定される型引数を使用してジェネリック メソッドを動的に呼び出すにはどうすればよいですか?

C# で実行時に決定される型引数を使用してジェネリック メソッドを動的に呼び出すにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-30 19:09:13636ブラウズ

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

動的型引数を使用したジェネリック メソッドの呼び出し

問題

シナリオでは、特定の名前空間内のインターフェイスのコレクションを反復処理し、各インターフェイスのジェネリック メソッドを動的に呼び出します。ただし、コンパイル時に不明な型引数が原因でコンパイル時エラーが発生します。

解決策

実行時に既知の型引数を使用してジェネリック メソッドを動的に呼び出すには、次のようにリフレクションを使用できます。

  1. ジェネリック メソッド情報の取得: Type.GetMethod メソッドを使用してジェネリック メソッドを取得します定義。
  2. ジェネリック メソッド インスタンスを生成します: ジェネリック メソッド定義で MakeGenericMethod メソッドを呼び出し、必要な型引数の特定のメソッド インスタンスを生成します。
  3. ジェネリック メソッド インスタンスを呼び出します: Invoke メソッドを使用して、必要なパラメータを指定して生成されたジェネリック メソッド インスタンスを呼び出します。 argument.

コード例

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。