Gunakan refleksi untuk memilih kaedah generik
Refleksi membenarkan kaedah panggilan dengan parameter jenis generik tertentu, tetapi apabila terdapat banyak beban generik, memilih kaedah yang sesuai boleh menjadi mencabar. Artikel ini menunjukkan pendekatan masa kompilasi untuk memilih kaedah generik sasaran dengan tepat dengan memanipulasi objek maklumat perwakilan dan kaedah.
Gunakan kaedah pemilihan perwakilan
Untuk kaedah statik, mencipta perwakilan dengan bilangan generik dan parameter yang diperlukan membolehkan pemilihan lebihan beban tertentu. Contohnya, untuk memilih lebihan pertama DoSomething<TModel>
, ia hanya mempunyai satu parameter generik:
<code class="language-C#">var method = new Action<object>(MyClass.DoSomething<object>);</code>
atau lebihan kedua, yang mempunyai dua parameter generik:
<code class="language-C#">var method = new Action<object, object>(MyClass.DoSomething<object, object>);</code>
Untuk kaedah sambungan statik, ikut corak yang serupa, menggunakan jenis yang sesuai untuk mengendalikan parameter this
:
<code class="language-C#">var method = new Func<IQueryable<object>, Expression<Func<bool>>, IQueryable<object>>(Queryable.Where<object>);</code>
Dapatkan maklumat kaedah
Sifat perwakilan Method
menyediakan objek MethodInfo
asas. Untuk mendapatkan definisi kaedah generik dan menyediakan parameter jenis tertentu:
<code class="language-C#">var methodInfo = method.Method.MakeGenericMethod(type1, type2);</code>
Kaedah contoh
Untuk memilih kaedah contoh, prosesnya adalah serupa:
<code class="language-C#">var method = new Action<object>(instance.MyMethod<object>); var methodInfo = method.Method.GetGenericMethodDefinition().MakeGenericMethod(type1);</code>
Menyah gandingan pemilihan kaedah dan jenis parameter
Jika parameter jenis generik tidak ditentukan sehingga kemudian:
<code class="language-C#">var methodInfo = method.Method.GetGenericMethodDefinition();</code>
Kemudian, hantar jenis yang diingini kepada MakeGenericMethod()
:
<code class="language-C#">methodInfo.MakeGenericMethod(type1, type2);</code>
Kesimpulan
Pendekatan ini membolehkan pemilihan kaedah generik yang tepat pada masa penyusunan, mengelakkan carian masa jalan yang terdedah kepada ralat atau penggunaan rentetan. Ia menyediakan mekanisme yang teguh dan fleksibel untuk memanggil kaedah generik dengan pelbagai jenis parameter.
Atas ialah kandungan terperinci Bagaimana untuk Memilih Kaedah Generik dengan Tepat dengan Refleksi pada Masa Penyusunan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!