gpt4 book ai didi

c# - 如何为采用泛型参数的泛型函数调用 GetMethod(不使用 GetMethods)?

转载 作者:行者123 更新时间:2023-11-30 13:56:11 26 4
gpt4 key购买 nike

我知道我可以使用 GetMethods 获取方法信息,但我想知道如何在没有 GetMethods 的情况下正确执行此操作。我读过其他 SO 问题和答案,这些问题和答案表明这是不可能的,或者建议只使用 LINQ,但这并不是问题的真正答案。

从最基本的层面考虑,一个采用单个通用参数的静态通用函数。

private static void Test<T>(T val)
{
}

要获取此方法信息,我们只需调用 Type.GetMethod("Test", BindingFlags.Static | BindingFlags.NonPublic)。但是,如果出于某种原因我们无法使用这个简单的 GetMethod 签名(可能是由于多重重载),那么我们需要提供参数类型。问题是我无法创建与 T val 参数准确匹配的参数类型。有趣的是,我可以从方法信息中获取参数(使用 GetMethods 获取)并将其传递到 GetMethod 中以获得所需的结果。这意味着如果只能创建适当的泛型类型(将 IsGenericParameter 设置为 true),那么我觉得这完全有可能。

所以这意味着这在 .NET 中是完全可能的,并且只需要创建适当的类型实例。如何创建这些类型实例?如果无法创建它们,为什么不呢?

我创建了 a simple fiddle展示问题。

最佳答案

它不容易获得,因为您需要的类型实际上是仅存在方法/参数定义中的泛型类型参数。例如,在您的 Test<T>(T val) ,参数类型是“由 T 定义的 Test<T>。你不能构造那个,因为它不是任何东西组成的。唯一的方法获得 T 是通过 GetParameters()

基本上,剩下的是:困难的方法 - 即手动。例如:

var method1 = typeof(Program).GetMethods(flags).Single(x => x.Name == "Test"
&& x.IsGenericMethodDefinition && x.GetParameters().Length == 1
&& x.GetParameters()[0].ParameterType == x.GetGenericArguments()[0])
.MakeGenericMethod(paramTypes1);

很明显,如果你知道只有一个 Test(...) 就更简单了方法:

var method = typeof(Program).GetMethod("Test", flags)
.MakeGenericMethod(paramTypes1);

关于c# - 如何为采用泛型参数的泛型函数调用 GetMethod(不使用 GetMethods)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29904106/

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