Saya memiliki daftar tipe (System.Type) yang perlu ditanyakan pada database.
Untuk masing-masing jenis ini, saya perlu memanggil metode ekstensi berikut (yang merupakan bagian dari LinqToNhibernate):
Session.Linq<MyType>()
Namun saya tidak memiliki MyType, tetapi saya ingin menggunakan Type.
Yang saya miliki adalah:
System.Type typeOne;
Tetapi saya tidak dapat melakukan hal berikut:
Session.Linq<typeOne>()
Bagaimana saya bisa menggunakan Type sebagai parameter Generik?
IQueryable
melakukan apa yang Anda butuhkan?Untuk melakukan ini, Anda perlu menggunakan refleksi:
typeof(Session).GetMethod("Linq").MakeGenericMethod(typeOne).Invoke(null, null);
(dengan asumsi itu
Linq<T>()
adalah metode statis pada tipeSession
)Jika
Session
sebenarnya adalah sebuah objek , Anda harus mengetahui di manaLinq
metode tersebut sebenarnya dideklarasikan, dan masukSession
sebagai argumen:typeof(DeclaringType).GetMethod("Linq").MakeGenericMethod(typeOne) .Invoke(null, new object[] {Session});
sumber
/// <summary> /// This method call your method through Reflection /// so i wil call the method like CallGenericMethodThroughReflection<Session>(assemblyQualifiedName,Linq,false,new[] { file }) /// </summary> /// <typeparam name="T">Call method from which file</typeparam> /// <param name="assemblyQualifiedName">Your can get assemblyQualifiedName like typeof(Payroll.Domain.Attendance.AttendanceApplicationMaster).AssemblyQualifiedName</param> /// <param name="methodName"></param> /// <param name="isStaticMethod"></param> /// <param name="paramaterList"></param> /// <param name="parameterType">pass parameter type list in case of the given method have overload </param> /// <returns>return object of calling method</returns> public static object CallGenericMethodThroughReflection<T>(string assemblyQualifiedName, string methodName,bool isStaticMethod ,object[] paramaterList,Type[] parameterType = null) { try { object instance = null; var bindingAttr = BindingFlags.Static | BindingFlags.Public; if (!isStaticMethod) { instance = Activator.CreateInstance<T>(); bindingAttr = BindingFlags.Instance | BindingFlags.Public; } MethodInfo MI = null; var type = Type.GetType(assemblyQualifiedName); if(parameterType == null) MI = typeof(T).GetMethod(methodName, bindingAttr); else MI = typeof(T).GetMethod(methodName, bindingAttr,null, parameterType, null);//this will work in most case some case not work if (type == null || MI == null) // if the condition is true it means given method or AssemblyQualifiedName entity not found return null; var genericMethod = MI.MakeGenericMethod(new[] { type }); return genericMethod.Invoke(instance, paramaterList); } catch (Exception ex) { throw ex; } }
sumber