Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah saya boleh menggunakan kaedah generik dalam C# dengan parameter jenis dinamik semasa runtime?

Bagaimanakah saya boleh menggunakan kaedah generik dalam C# dengan parameter jenis dinamik semasa runtime?

Susan Sarandon
Susan Sarandonasal
2025-02-03 07:52:11906semak imbas

How Can I Invoke Generic Methods in C# with Dynamic Type Parameters at Runtime?

c#Jalankan parameter jenis dinamik kaedah Scrang generik

Apabila menggunakan kaedah generik dalam C#, kadang -kadang parameter jenis tidak diketahui semasa menyusun, dan mesti diperoleh pada runtime. Artikel ini membincangkan amalan terbaik untuk memanggil kaedah generik dalam kes ini.

Pertimbangkan contoh kod berikut, di mana

kaedah cuba menggunakan parameter jenis yang diperoleh dari pembolehubah runtime

untuk memanggil kaedah generik Example. myType GenericMethod<T>

Seperti yang ditunjukkan dalam contoh, cuba panggil
<code class="language-csharp">public class Sample
{
    public void Example(string typeName)
    {
        Type myType = FindType(typeName);
        GenericMethod<myType>(); // 这行代码无法编译通过
        StaticMethod<myType>(); // 这行代码也无法编译通过
    }

    public void GenericMethod<T>()
    {
        // ...
    }

    public static void StaticMethod<T>()
    {
        // ...
    }
}</code>
secara langsung, kerana pengkompil tidak dapat menyimpulkan parameter jenis semasa penyusunan. Untuk menyelesaikan masalah ini, kita perlu menggunakan refleksi untuk mendapatkan kaedah, dan kemudian menggunakan parameter jenis yang diperlukan untuk "membina" itu.

GenericMethod<myType> Kaedah

untuk mendapatkan kaedah dari jenis semasa, dan
<code class="language-csharp">MethodInfo method = typeof(Sample).GetMethod(nameof(Sample.GenericMethod));
MethodInfo generic = method.MakeGenericMethod(myType);
generic.Invoke(this, null);</code>
menggunakan parameter jenis yang ditentukan untuk membina spesifikasi kaedah generik. Akhirnya, digunakan untuk memanggil kaedah generik pembina.

GetMethod untuk kaedah statik, MakeGenericMethod lulus Invoke sebagai parameter pertama untuk

. Ini tidak ada kaitan dengan kaedah generik, tetapi hanya mencerminkan kaedah memanggil kaedah statik melalui refleksi.

null Dalam C# 4 dan versi yang lebih tinggi, jika kesimpulan jenis mungkin, panggilan dinamik boleh digunakan untuk memudahkan proses ini, tetapi ini tidak selalu berlaku. Penyelesaian yang disediakan oleh refleksi masih merupakan kaedah yang boleh dipercayai untuk memanggil kaedah generik menggunakan parameter jenis dinamik. Invoke

Atas ialah kandungan terperinci Bagaimanakah saya boleh menggunakan kaedah generik dalam C# dengan parameter jenis dinamik semasa runtime?. 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