Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menggunakan Jenis Pembolehubah sebagai Parameter Generik dalam C#?
Menggunakan jenis pembolehubah sebagai parameter generik dalam C#
Generik dalam C# menyediakan keselamatan jenis masa kompilasi, yang memerlukan jenis diketahui pada masa penyusunan.
Andaikan anda mentakrifkan kaedah generik:
<code class="language-csharp">bool DoesEntityExist<T>(Guid guid, ITransaction transaction) where T : IGloballyIdentifiable;</code>
Apabila anda cuba menggunakannya secara dinamik, anda akan menghadapi ralat kompilasi:
<code class="language-csharp">Type t = entity.GetType(); DoesEntityExist<t>(entityGuid, transaction);</code>
Ini kerana t
hanya diketahui pada masa jalanan, yang melanggar prinsip keselamatan jenis masa kompilasi generik.
Anda boleh menggunakan refleksi untuk mengendalikan kaedah generik yang ditaip secara dinamik:
<code class="language-csharp">MethodInfo method = GetType().GetMethod("DoesEntityExist") .MakeGenericMethod(new Type[] { t }); method.Invoke(this, new object[] { entityGuid, transaction });</code>
Walau bagaimanapun, pendekatan ini tidak sesuai kerana kerumitan dan prestasi overhednya.
Penyelesaian yang lebih baik ialah menjadikan kaedah panggilan anda generik dan lulus parameter jenis sebagai parameter jenis:
<code class="language-csharp">void MyMethod<T>(T entity, Guid guid, ITransaction transaction) { DoesEntityExist<T>(guid, transaction); }</code>
Dengan cara ini, anda boleh menentukan jenis secara dinamik semasa memanggil MyMethod
, mengelakkan penggunaan pantulan sambil mengekalkan keselamatan jenis.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggunakan Jenis Pembolehubah sebagai Parameter Generik dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!