Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Boleh Memilih Kaedah Generik yang Beban Lebihan Menggunakan Refleksi?
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.
Untuk menyelesaikan masalah ini, anda boleh menggunakan penyelesaian yang selamat kompilasi:
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>
Ekstrak MethodInfo
daripada perwakilan atau ungkapan dan gunakan GetGenericMethodDefinition
untuk mendapatkan definisi kaedah generik.
<code class="language-csharp">var methodInfo = method.Method.GetGenericMethodDefinition();</code>
Lepaskan parameter jenis generik sebenar kepada MakeGenericMethod
untuk membuat contoh kaedah generik tertentu.
<code class="language-csharp">var typedMethod = methodInfo.MakeGenericMethod(type1, type2);</code>
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>
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!