如何调用GetMethod获取带有泛型参数的泛型函数(不使用GetMethods)?

pjs*_*pjs 3 .net c# generics reflection

我知道我可以使用获取方法信息GetMethods,但我想知道如何正确地使用它GetMethods.我已经阅读了其他SO问题和答案,表明这是不可能的,或建议只使用LINQ,但这不是问题的真正答案.

在最基本的层面考虑一个静态泛型函数,它接受一个通用参数.

private static void Test<T>(T val)
{
}
Run Code Online (Sandbox Code Playgroud)

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

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

我创建了一个简单的小提示来展示这个问题.

Mar*_*ell 5

它不是现成的,因为您需要的类型实际上是仅存在于方法/参数定义中的泛型类型参数.例如,在你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);
Run Code Online (Sandbox Code Playgroud)

如果你知道只有一种Test(...)方法,显然会更简单:

var method = typeof(Program).GetMethod("Test", flags)
    .MakeGenericMethod(paramTypes1);
Run Code Online (Sandbox Code Playgroud)

  • @pjs和:没有.所需的类型只存在于*方法定义内部 - 引用一个通用方法的参数类型,你*使用`GetParameters()`等.抱歉,但这就是它的方式. (3认同)