Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menggunakan Kaedah Generik Secara Dinamik dengan Argumen Jenis Ditentukan Masa Jalan dalam C#?

Bagaimanakah Saya Boleh Menggunakan Kaedah Generik Secara Dinamik dengan Argumen Jenis Ditentukan Masa Jalan dalam C#?

Barbara Streisand
Barbara Streisandasal
2024-12-30 19:09:13636semak imbas

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

Memanggil Kaedah Generik dengan Argumen Jenis Dinamik

Masalah

Dalam senario anda, anda ingin mengulangi koleksi antara muka dalam ruang nama tertentu dan menggunakan kaedah generik secara dinamik untuk setiap antara muka. Walau bagaimanapun, anda menghadapi ralat masa kompilasi disebabkan oleh argumen jenis yang tidak diketahui pada masa penyusunan.

Penyelesaian

Untuk memanggil kaedah generik secara dinamik dengan argumen jenis diketahui masa jalan, anda boleh menggunakan refleksi seperti berikut:

  1. Dapatkan maklumat kaedah generik: Gunakan kaedah Type.GetMethod untuk mendapatkan semula definisi kaedah generik.
  2. Janakan contoh kaedah generik: Panggil kaedah MakeGenericMethod pada definisi kaedah generik untuk menjana contoh kaedah khusus untuk hujah jenis yang diingini.
  3. Gunakan contoh kaedah generik: Gunakan kaedah Invoke untuk memanggil yang dijana contoh kaedah generik dengan hujah yang diperlukan.

Kod Contoh

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
        }
    }
}

Dalam contoh ini:

  • Kaedah CallGeneric ditakrifkan sebagai kaedah generik yang mencetak hujah jenis generik.
  • Kami mengambil semua jenis daripada ruang nama tertentu yang diwarisi daripada MyNamespace.Antaramuka.
  • Kami menggunakan refleksi untuk mendapatkan kaedah generik CallGeneric dan mencipta contoh kaedah generik untuk setiap jenis antara muka.
  • Kami menggunakan contoh kaedah generik tanpa sebarang sasaran atau hujah kerana ia adalah kaedah statik tanpa sebarang parameter.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggunakan Kaedah Generik Secara Dinamik dengan Argumen Jenis Ditentukan Masa Jalan dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn