使用基于参数的Reflection获取正确的重载方法

时间:2017-07-31 20:48:02

标签: c# overloading system.reflection

假设我有一个包含许多重载的方法,例如Console.WriteLine,我想通过Reflection获取。我有一个dynamicx,想要获取x类型最相关的方法,如下所示:

var consoleType = Type.GetType("System.Console")

dynamic x = "Foo";
GetMethodFromParams(consoleType, "WriteLine", new[] {x}); // => [Void WriteLine(string)]

x = 3;
GetMethodFromParams(consoleType, "WriteLine", new[] {x}); // => [Void WriteLine(int)]

x = new SomeClass();
GetMethodFromParams(consoleType, "WriteLine", new[] {x}); // => [Void WriteLine(object)]

从我所看到的,如果您知道方法的参数类型,则只能获取方法,否则抛出异常:

> Type.GetType("System.Console").GetMethod("WriteLine")
Ambiguous match found.
  + System.RuntimeType.GetMethodImpl(string, System.Reflection.BindingFlags, System.Reflection.Binder, System.Reflection.CallingConventions, System.Type[], System.Reflection.ParameterModifier[])
  + System.Type.GetMethod(string)

> Type.GetType("System.Console").GetMethod("WriteLine", new[] { Type.GetType("System.String") })
[Void WriteLine(System.String)]

我如何实现上面演示的GetMethodFromParams方法?我有一个想法是使用Type.GetType(...).GetMethods()方法并根据与x类型相比的参数类型过滤结果,但这对于处理协方差和逆变可能很棘手。

1 个答案:

答案 0 :(得分:0)

事实证明,您只需使用x.GetType()获取x的类型,并将其作为数组元素传递给GetMethod,即使对于协方差和逆变。这意味着您可以这样实现:

public static MethodInfo GetMethodFromParams(Type t, string methodName, dynamic[] args)
    => t.GetMethod(methodName,
           args.Select(x => (Type)x.GetType())
               .ToArray());