gpt4 book ai didi

c# - 如何使用反射找到特定的通用重载?

转载 作者:太空狗 更新时间:2023-10-30 00:36:34 24 4
gpt4 key购买 nike

我正在尝试创建一个 Expression这将调用特定的通用重载方法(在我的第一个测试用例中为 Enumerable.Average)。直到运行时才知 Prop 体的类型绑定(bind),所以我需要使用 Reflection找到并创建正确的通用方法(Expression 是从解析的文本创建的)。

所以如果我在运行时知道我想找到这个特定的重载:

public static double Average<TSource>(this IEnumerable<TSource> source, Func<TSource, int> selector)

我如何解决那个特定的 MethodInfo使用反射?

到目前为止,我有以下选择语句:

MethodInfo GetMethod(Type argType, Type returnType)
{
var methods = from method in typeof(Enumerable).GetMethods(BindingFlags.Public | BindingFlags.Static)
where method.Name == "Average" &&
method.ContainsGenericParameters &&
method.GetParameters().Length == 2 &&
// and some condition where method.GetParameters()[1] is a Func that returns type argType
method.ReturnType == returnType
select method;

Debug.Assert(methods.Count() == 1);
return methods.FirstOrDefault();
}

以上将其缩小为三个重载,但我想反射(reflect)并找到需要 Func<TSource, int> 的特定重载其中 argType == typeof(int) .

我很困惑,感谢任何帮助。

最佳答案

您需要使用 MethodInfo.MakeGenericMethod

编辑:好的,我误解了这个问题......这个方法应该做你想做的:

MethodInfo GetMethod(Type argType, Type returnType)
{
var enumerableType = typeof(IEnumerable<>).MakeGenericType(new Type[] { argType });
Console.WriteLine(enumerableType);
var methods = from method in typeof(Enumerable).GetMethods(BindingFlags.Public | BindingFlags.Static)
let parameters = method.GetParameters()
let genParams = method.GetGenericArguments()
where method.Name == "Average" &&
method.ContainsGenericParameters &&
parameters.Length == 2 &&
parameters[1].ParameterType.GetGenericTypeDefinition() == typeof(Func<,>) &&
parameters[1].ParameterType.GetGenericArguments()[1] == argType &&
method.ReturnType == returnType
select method;

return methods.FirstOrDefault();
}

关于c# - 如何使用反射找到特定的通用重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1465715/

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