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
Barbara Streisandasal
2025-01-11 13:42:43248semak imbas

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>

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>

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>

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>

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>

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>

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!

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