gpt4 book ai didi

c# - 不使用 GetMethods 获取泛型方法

转载 作者:IT王子 更新时间:2023-10-29 04:18:36 29 4
gpt4 key购买 nike

我想获取方法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结果。

最佳答案

已解决(通过破解 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(WhateverClassYouDeclareTheseMethodsIn)。

关于c# - 不使用 GetMethods 获取泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/269578/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com