gpt4 book ai didi

.net - 如何在非通用 .NET 类型上获取通用方法的 MethodInfo?

转载 作者:行者123 更新时间:2023-12-04 10:45:52 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Is there a good way of getting MethodInfo of open generic method?

(3 个回答)


7年前关闭。




我有一个小问题,我无法弄清楚将哪些参数传递给 Type.GetMethod 以取回非泛型类型上泛型方法的 MethodInfo。
具体来说,我有这个类型定义:

public static class A
{
public static B F<T>(bool dummy)
{
}
public static B F<T>(IEnumerable<T> arg)
{
...
}
}

我在 Type.GetMethod 上尝试了几次,但没有一个会返回 F 方法的 MethodInfo。

我知道我可以调用 Type.GetMethods 甚至 Type.FindMember,但我对 Type.GetMethod 感兴趣。

有任何想法吗?

谢谢。

编辑

实际上,我的代码有点复杂。泛型方法被重载,所以我不能只使用函数名来使用 Type.GetMethod。
我尝试了这些变体:
typeof(A).GetMethod("F", BindingFlags.Static | BindingFlags.Public, null, new Type[]{ typeof(IEnumerable<>) }, null)
typeof(A).GetMethod("F`1", BindingFlags.Static | BindingFlags.Public, null, new Type[]{ typeof(IEnumerable<>) }, null)
typeof(A).GetMethod("F[T]", BindingFlags.Static | BindingFlags.Public, null, new Type[]{ typeof(IEnumerable<>) }, null)
typeof(A).GetMethod("F[[T]]", BindingFlags.Static | BindingFlags.Public, null, new Type[]{ typeof(IEnumerable<>) }, null)

最佳答案

问题在于IEnumerable<>您传递给 GetMethod 的参数不是专门的。真的是IEnumerable<T> ,其中 T由您尝试检索的方法指定。但是,我们无法得到T通过 MethodInfo.GetGenericArguments()因为我们没有对该方法的引用——我们仍在尝试检索它。

不幸的是,这就是反射 API 的不足之处。没有Type.GetMethod()允许您区分重载方法的重载,其中一个是泛型​​方法。

话虽如此,您仍然无法使用 Type.GetMethods()并使用您选择的谓词过滤结果。要获取您感兴趣的方法,您可以执行以下操作。

void getMethod()
{
typeof(A).GetMethods().Where(m =>
m.IsGenericMethod &&
m.GetParameters()[0].ParameterType.GetGenericTypeDefinition()
== typeof(IEnumerable<>));
}

注意我还没有验证 GetGenericTypeDefinition()需要打电话;你可以省略它。这个想法是你正在转换一个类型 A<T>进入 A<> ,但运行时可能已经以这种形式提供给您。

关于.net - 如何在非通用 .NET 类型上获取通用方法的 MethodInfo?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1624817/

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