Rumah >pembangunan bahagian belakang >C++ >Bagaimana Saya Boleh Memilih Kaedah Generik yang Beban Lebihan Menggunakan Refleksi?
Memilih kaedah generik yang sesuai melalui refleksi boleh menjadi mencabar, terutamanya apabila terdapat banyak lebihan generik kaedah tersebut. Artikel ini meneroka cara kompilasi selamat dan cekap untuk memilih kaedah generik yang betul tanpa bergantung pada rentetan atau carian masa jalan.
Menggunakan ungkapan lambda atau perwakilan dengan kaedah MethodInfo.MakeGenericMethod
membolehkan lebihan generik tertentu dipilih pada masa penyusunan. Contohnya, jika anda mempunyai kaedah generik berikut:
<code>public static void DoSomething<TModel>(TModel model)</code>
Anda boleh membuat perwakilan untuk memadankan kiraan generik dan kiraan hujahnya:
<code>var method = new Action<object>(MyClass.DoSomething<object>);</code>
Dengan menggantikan jenis generik dengan object
anda boleh memilih beban lampau yang betul tanpa menggunakan paip masa jalan atau manipulasi rentetan yang berisiko.
Untuk kaedah statik (seperti dalam kelas System.Linq.Queryable
) anda boleh menggunakan pendekatan yang serupa. Contohnya, untuk memilih kaedah IQueryable<TModel>
yang mengambil Expression<Func<TModel, bool>>
dan Where
, anda akan melakukan perkara berikut:
<code>var method = new Func<IQueryable<object>, Expression<Func<object, bool>>, IQueryable<object>>(Queryable.Where<object>);</code>
Untuk memilih kaedah contoh, anda boleh mengikut corak yang serupa tetapi gunakan MakeGenericMethod
untuk mendapatkan GetGenericMethodDefinition
generik sebelum memanggil MethodInfo
.
MethodInfo
dan jenis parameterAnda boleh menggunakan GetGenericMethodDefinition
untuk mengasingkan pemilihan MethodInfo
daripada penetapan jenis generik dan menyerahkan MethodInfo
kepada kaedah lain yang mengetahui jenis yang hendak dijadikan instantiat dan memanggil kaedah dengan jenis itu.
Untuk menggambarkan pendekatan ini, pertimbangkan kelas dengan banyak kelebihan kaedah generik CopyList
. Kod berikut menunjukkan cara memilih beban berlebihan yang betul menggunakan teknik di atas:
<code>var listTo = ReflectionHelper.GetIEnumerableType(fromValue.GetType()); var fn = new Func<IEnumerable<object>, Func<PropertyInfo, bool>, Dictionary<Type, Type>, IEnumerable<object>>(ModelTransform.CopyList<object>); var copyListMethod = fn.GetMethodInfo().GetGenericMethodDefinition().MakeGenericMethod(listTo); copyListMethod.Invoke(null, new object[] { fromValue, whereProps, typeMap });</code>
Dengan memanfaatkan kuasa ekspresi lambda dan perwakilan, anda boleh memilih kaedah generik yang betul secara elegan melalui refleksi, memastikan keselamatan masa penyusunan dan mengelakkan perangkap carian berasaskan rentetan atau masa jalan.
Atas ialah kandungan terperinci Bagaimana Saya Boleh Memilih Kaedah Generik yang Beban Lebihan Menggunakan Refleksi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!