Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Memanggil Kaedah Generik dengan Jenis Yang Ditentukan Masa Jalan?

Bagaimanakah Saya Boleh Memanggil Kaedah Generik dengan Jenis Yang Ditentukan Masa Jalan?

Linda Hamilton
Lepaskan: 2024-12-30 14:53:16
asal
1019 orang telah melayarinya

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

Memanggil Kaedah Generik dengan Jenis Ditentukan pada Masa Jalan

Isu ini timbul apabila cuba memanggil kaedah generik dengan parameter jenis tidak diketahui pada masa penyusunan . Panggilan kaedah biasa bergantung pada pemeriksaan keselamatan jenis yang dilakukan oleh pengkompil, tetapi apabila jenis itu hanya tersedia pada masa jalanan, pendekatan alternatif diperlukan.

Penyelesaian Berasaskan Refleksi

Dalam konteks contoh kod yang disediakan:

public void Method<T>() where T : class {}
public void AnotherMethod()
{
    ...
    foreach (var interface in interfaces)
    {
        Method<interface>(); // Compile error!
    }
}
Salin selepas log masuk

Untuk memintas jenis masa kompilasi menyemak:

  1. Dapatkan semula kaedah generik terbuka menggunakan Type.GetMethod:

    MethodInfo method = typeof(Test).GetMethod("Method");
    Salin selepas log masuk
  2. Buat kaedah generik dengan MakeGenericMethod:

    MethodInfo genericMethod = method.MakeGenericMethod(interface);
    Salin selepas log masuk
  3. Gunakan kaedah dengan Invoke:

    genericMethod.Invoke(null, null); // No target or arguments in this case
    Salin selepas log masuk

Contoh Lengkap

Untuk menjelaskan proses, pertimbangkan contoh kod yang disemak ini:

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);
            }
        }
    }
}
Salin selepas log masuk

Dalam contoh ini, kaedah CallMe generik dipanggil secara dinamik berdasarkan jenis yang terdapat dalam ruang nama Contoh.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memanggil Kaedah Generik dengan Jenis Yang Ditentukan Masa Jalan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan