Refleksi membolehkan pembangun mengakses maklumat jenis dan kaedah panggilan secara dinamik. Walau bagaimanapun, membezakan antara beban berlebihan boleh menjadi mencabar apabila memilih kaedah generik. Sebagai contoh, kelas System.Linq.Queryable
mengandungi takrifan untuk berbilang kaedah Where
, menjadikannya sukar untuk memilih versi yang diperlukan.
Untuk menyelesaikan masalah ini, anda boleh menggunakan penyelesaian yang selamat kompilasi:
Bina perwakilan atau ungkapan dengan nombor dan jenis parameter generik dan kaedah yang betul yang sepadan dengan beban sasaran. Contohnya:
var method = new Action<object>(MyClass.DoSomething<object>);
Ekstrak MethodInfo
daripada perwakilan atau ungkapan dan gunakan GetGenericMethodDefinition
untuk mendapatkan definisi kaedah generik.
var methodInfo = method.Method.GetGenericMethodDefinition();
Lepaskan parameter jenis generik sebenar kepada MakeGenericMethod
untuk membuat contoh kaedah generik tertentu.
var typedMethod = methodInfo.MakeGenericMethod(type1, type2);
Untuk kaedah Queryable.Where
dengan lebihan beban:
public static IQueryable<TModel> Where<TModel>(this IQueryable<TModel>, Expression<Func<TModel, bool>>) public static IQueryable<TModel> Where<TModel>(this IQueryable<TModel>, Expression<Func<TModel, int, bool>>)
Kod berikut menunjukkan cara memilih versi pertama:
var method = new Func<IQueryable<object>, Expression<Func<object, bool>>, IQueryable<object>>(Queryable.Where<object>); var methodInfo = method.Method.GetGenericMethodDefinition().MakeGenericMethod(modelType);
Untuk fleksibiliti yang lebih besar, anda boleh mendapatkan MethodInfo
secara berasingan dan nyatakan parameter jenis generik kemudian. Ini berguna apabila jenis tidak diketahui semasa mendapatkan semula kaedah.
var methodInfo = method.Method.GetGenericMethodDefinition(); var typedMethod = methodInfo.MakeGenericMethod(type1, type2);
Dengan mengikut langkah-langkah ini, pembangun boleh memilih kaedah generik yang betul melalui refleksi dengan cara yang selamat dan fleksibel, walaupun terdapat banyak beban berlebihan.
Atas ialah kandungan terperinci Bagaimana untuk Boleh Memilih Kaedah Generik yang Beban Lebihan Menggunakan Refleksi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!