


Bagaimana untuk Boleh Memilih Kaedah Generik yang Beban Lebihan Menggunakan Refleksi?
Jan 11, 2025 pm 01:42 PMGunakan refleksi untuk memilih kaedah generik yang betul
Latar belakang
Refleksi membolehkan pembangun mengakses maklumat jenis dan kaedah panggilan secara dinamik. Walau bagaimanapun, membezakan antara beban berlebihan boleh menjadi mencabar apabila memilih kaedah generik. Sebagai contoh, kelas System.Linq.Queryable
mengandungi takrifan untuk berbilang kaedah Where
, menjadikannya sukar untuk memilih versi yang diperlukan.
Pilih kaedah yang betul berdasarkan jenis parameter
Untuk menyelesaikan masalah ini, anda boleh menggunakan penyelesaian yang selamat kompilasi:
1. Buat perwakilan atau ungkapan yang sepadan dengan beban berlebihan yang diingini
Bina perwakilan atau ungkapan dengan nombor dan jenis parameter generik dan kaedah yang betul yang sepadan dengan beban sasaran. Contohnya:
var method = new Action<object>(MyClass.DoSomething<object>);
2. Dapatkan Maklumat Kaedah generik
Ekstrak MethodInfo
daripada perwakilan atau ungkapan dan gunakan GetGenericMethodDefinition
untuk mendapatkan definisi kaedah generik.
var methodInfo = method.Method.GetGenericMethodDefinition();
3. Tentukan parameter jenis generik
Lepaskan parameter jenis generik sebenar kepada MakeGenericMethod
untuk membuat contoh kaedah generik tertentu.
var typedMethod = methodInfo.MakeGenericMethod(type1, type2);
Contoh menggunakan Queryable.Where overload
Untuk kaedah Queryable.Where
dengan lebihan beban:
public static IQueryable<TModel> Where<TModel>(this IQueryable<TModel>, Expression<Func<TModel, bool>>) public static IQueryable<TModel> Where<TModel>(this IQueryable<TModel>, Expression<Func<TModel, int, bool>>)
Kod berikut menunjukkan cara memilih versi pertama:
var method = new Func<IQueryable<object>, Expression<Func<object, bool>>, IQueryable<object>>(Queryable.Where<object>); var methodInfo = method.Method.GetGenericMethodDefinition().MakeGenericMethod(modelType);
Info Kaedah Penyahgandingan dan jenis parameter
Untuk fleksibiliti yang lebih besar, anda boleh mendapatkan MethodInfo
secara berasingan dan nyatakan parameter jenis generik kemudian. Ini berguna apabila jenis tidak diketahui semasa mendapatkan semula kaedah.
var methodInfo = method.Method.GetGenericMethodDefinition(); var typedMethod = methodInfo.MakeGenericMethod(type1, type2);
Dengan mengikut langkah-langkah ini, pembangun boleh memilih kaedah generik yang betul melalui refleksi dengan cara yang selamat dan fleksibel, walaupun terdapat banyak beban berlebihan.
Atas ialah kandungan terperinci Bagaimana untuk Boleh Memilih Kaedah Generik yang Beban Lebihan Menggunakan Refleksi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Artikel Panas

Alat panas Tag

Artikel Panas

Tag artikel panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Gulc: Perpustakaan C dibina dari awal

Apakah jenis nilai yang dikembalikan oleh fungsi bahasa C? Apa yang menentukan nilai pulangan?

Langkah Format Fungsi Fungsi C Langkah Penukaran Kes

Apakah definisi dan peraturan panggilan fungsi bahasa C dan apakah itu

Penggunaan dan perkongsian frasa yang berbeza

Di manakah nilai pulangan fungsi bahasa C yang disimpan dalam ingatan?

Bagaimana Perpustakaan Templat St Standard (STL) berfungsi?

Bagaimanakah saya menggunakan algoritma dari STL (jenis, mencari, mengubah, dll) dengan cekap?
