假设我有一个包含许多重载的方法,例如Console.WriteLine
,我想通过Reflection获取。我有一个dynamic
值x
,想要获取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
类型相比的参数类型过滤结果,但这对于处理协方差和逆变可能很棘手。
答案 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());