Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Boleh Memilih Kaedah Generik yang Beban Lebihan Menggunakan Refleksi?

Bagaimana untuk Boleh Memilih Kaedah Generik yang Beban Lebihan Menggunakan Refleksi?

Barbara Streisand
Lepaskan: 2025-01-11 13:42:43
asal
247 orang telah melayarinya

How to Reliably Select the Correct Generic Method Overload Using Reflection?

Gunakan 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:

<code class="language-csharp">var method = new Action<object>(MyClass.DoSomething<object>);</code>
Salin selepas log masuk

2. Dapatkan Maklumat Kaedah generik

Ekstrak MethodInfo daripada perwakilan atau ungkapan dan gunakan GetGenericMethodDefinition untuk mendapatkan definisi kaedah generik.

<code class="language-csharp">var methodInfo = method.Method.GetGenericMethodDefinition();</code>
Salin selepas log masuk

3. Tentukan parameter jenis generik

Lepaskan parameter jenis generik sebenar kepada MakeGenericMethod untuk membuat contoh kaedah generik tertentu.

<code class="language-csharp">var typedMethod = methodInfo.MakeGenericMethod(type1, type2);</code>
Salin selepas log masuk

Contoh menggunakan Queryable.Where overload

Untuk kaedah Queryable.Where dengan lebihan beban:

<code class="language-csharp">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>>)</code>
Salin selepas log masuk

Kod berikut menunjukkan cara memilih versi pertama:

<code class="language-csharp">var method = new Func<IQueryable<object>, Expression<Func<object, bool>>, IQueryable<object>>(Queryable.Where<object>);

var methodInfo = method.Method.GetGenericMethodDefinition().MakeGenericMethod(modelType);</code>
Salin selepas log masuk

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.

<code class="language-csharp">var methodInfo = method.Method.GetGenericMethodDefinition();

var typedMethod = methodInfo.MakeGenericMethod(type1, type2);</code>
Salin selepas log masuk

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!

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