我想获得方法System.Linq.Queryable.OrderyBy<T, TKey>(the IQueryable<T> source, Expression<Func<T,TKey>> keySelector)方法,但我不断提出空值。
System.Linq.Queryable.OrderyBy<T, TKey>(the IQueryable<T> source, Expression<Func<T,TKey>> keySelector)
var type = typeof(T); var propertyInfo = type.GetProperty(group.PropertyName); var propertyType = propertyInfo.PropertyType; var sorterType = typeof(Func<,>).MakeGenericType(type, propertyType); var expressionType = typeof(Expression<>).MakeGenericType(sorterType); var queryType = typeof(IQueryable<T>); var orderBy = typeof(System.Linq.Queryable).GetMethod("OrderBy", new[] { queryType, expressionType }); /// is always null.
有人有见识吗?我宁愿不要遍历GetMethods结果。
GetMethods
解决了(通过入侵LINQ)!
在研究相同问题时,我看到了您的问题。在找不到好的解决方案之后,我想到了LINQ表达式树。这是我想出的:
public static MethodInfo GetOrderByMethod<TElement, TSortKey>() { Func<TElement, TSortKey> fakeKeySelector = element => default(TSortKey); Expression<Func<IEnumerable<TElement>, IOrderedEnumerable<TElement>>> lamda = list => list.OrderBy(fakeKeySelector); return (lamda.Body as MethodCallExpression).Method; } static void Main(string[] args) { List<int> ints = new List<int>() { 9, 10, 3 }; MethodInfo mi = GetOrderByMethod<int, string>(); Func<int,string> keySelector = i => i.ToString(); IEnumerable<int> sortedList = mi.Invoke(null, new object[] { ints, keySelector } ) as IEnumerable<int>; foreach (int i in sortedList) { Console.WriteLine(i); } }
输出:10 3 9
编辑:如果您在编译时不知道类型,这是如何获取方法:
public static MethodInfo GetOrderByMethod(Type elementType, Type sortKeyType) { MethodInfo mi = typeof(Program).GetMethod("GetOrderByMethod", Type.EmptyTypes); var getOrderByMethod = mi.MakeGenericMethod(new Type[] { elementType, sortKeyType }); return getOrderByMethod.Invoke(null, new object[] { }) as MethodInfo; }
确保将typeof(Program)替换为typeof(WhatClassClassYouDeclareTheseMethodsIn)。