Mam listę typów (System.Type), które wymagają zapytania w bazie danych.
Dla każdego z tych typów muszę wywołać następującą metodę rozszerzenia (która jest częścią LinqToNhibernate):
Session.Linq<MyType>()
Jednak nie mam MyType, ale chcę zamiast tego użyć Type.
Co mam to:
System.Type typeOne;
Ale nie mogę wykonać następujących czynności:
Session.Linq<typeOne>()
Jak mogę użyć typu jako parametru ogólnego?
IQueryable
robią to, czego potrzebujesz?Aby to zrobić, musisz użyć odbicia:
typeof(Session).GetMethod("Linq").MakeGenericMethod(typeOne).Invoke(null, null);
(zakładając, że
Linq<T>()
jest to metoda statyczna na typieSession
)Jeśli
Session
faktycznie jest obiektem , musisz wiedzieć, gdzieLinq
metoda jest faktycznie zadeklarowana i przekazać jąSession
jako argument:typeof(DeclaringType).GetMethod("Linq").MakeGenericMethod(typeOne) .Invoke(null, new object[] {Session});
źródło
/// <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; } }
źródło