Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Memilih Kaedah Generik yang Beban Lebihan Menggunakan Refleksi dalam C#?

Bagaimanakah Saya Boleh Memilih Kaedah Generik yang Beban Lebihan Menggunakan Refleksi dalam C#?

Linda Hamilton
Lepaskan: 2025-01-11 13:27:42
asal
226 orang telah melayarinya

How Can I Safely Select the Correct Generic Method Overload Using Reflection in C#?

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

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