Gunakan refleksi untuk memilih kaedah generik yang betul
Apabila menggunakan kaedah generik melalui refleksi, memilih lebihan beban yang betul boleh menjadi mencabar apabila terdapat berbilang bebanan generik. Masalah ini berlaku apabila nama kaedah tidak jelas, seperti kaedah "Where" dalam kelas System.Linq.Queryable.
Daripada bergantung pada andaian atau menyemak nama kaedah, terdapat cara selamat masa kompilasi untuk memilih lebihan generik yang betul menggunakan perwakilan.
Kaedah statik
Pertimbangkan kaedah statik berikut dengan berbilang beban generik:
<code class="language-csharp">public static void DoSomething<TModel>(TModel model) public static void DoSomething<TViewModel, TModel>(TViewModel viewModel, TModel model)</code>
Untuk memilih lebihan pertama (jenis pemulangan void, satu parameter generik), buat perwakilan operasi yang sepadan dengan tandatangannya:
<code class="language-csharp">var method = new Action<object>(MyClass.DoSomething<object>);</code>
Untuk lebihan kedua (jenis pengembalian void, dua parameter generik), gunakan perwakilan tindakan dengan dua parameter objek:
<code class="language-csharp">var method = new Action<object, object>(MyClass.DoSomething<object, object>);</code>
Kaedah ini memilih lebihan beban yang betul berdasarkan kiraan generik perwakilan dan kiraan hujah.
Untuk mendapatkan objek MethodInfo, gunakan sifat Kaedah perwakilan dan panggil MakeGenericMethod():
<code class="language-csharp">var methodInfo = method.Method.MakeGenericMethod(type1, type2);</code>
Kaedah sambungan statik
Sebagai contoh kaedah, gunakan kaedah pilih kaedah yang serupa, tetapi panggil GetGenericMethodDefinition() sebelum menghantar jenis kepada MakeGenericMethod():
<code class="language-csharp">var methodInfo = method.Method.GetGenericMethodDefinition().MakeGenericMethod(type1);</code>
Maklumat Kaedah Penyahgandingan dan jenis parameter
Anda boleh mendapatkan objek MethodInfo generik dengan memanggil GetGenericMethodDefinition(), dengan itu menyahganding pemilihan objek MethodInfo daripada jenis parameter:
<code class="language-csharp">var methodInfo = method.Method.GetGenericMethodDefinition();</code>
Kemudian, hantar jenis yang diperlukan kepada MakeGenericMethod() apabila memanggil kaedah:
<code class="language-csharp">processCollection(methodInfo, type2); ... protected void processCollection(MethodInfo method, Type type2) { var type1 = typeof(MyDataClass); object output = method.MakeGenericMethod(type1, type2).Invoke(null, new object[] { collection }); }</code>
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memilih Kaedah Generik yang Beban Lebihan Menggunakan Refleksi dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!