如何通过反射匹配名称和参数类型获取受保护的方法?
How can I get a protected method via reflection matching name and parameters type?
在 dotnet core 之前我们可以做到
var member = type.GetMethod(name, bindingFlags, null, argtypes, null);
为了访问与其名称和参数类型匹配的方法,在 dotnet 核心中他们删除了这个重载,现在我只能通过 name && binding flags
或 name && parameters type
(see) , 但不像以前那样。
有一个新方法 GetRuntimeMethods,其中 returns IEnumerable<MethodInfo>
包括非 public 方法,但我无法按参数类型过滤。
还有另一种方法 GetRuntimeMethod,我可以按参数类型过滤,但它不包括非 public 方法。
我已经尝试过类似的方法,但失败了
var member = type.GetRuntimeMethods().Where(m =>
m.Name == name && (m.GetParameters().Select(p => p.GetType()).ToArray() == argtypes)).FirstOrDefault();
有没有办法通过名称和参数类型获取方法?
是的,确实缺少那个过载。您可以使用的是 GetMethods()
并按照您想要的方式过滤输出。您的尝试很接近,除了您不能使用 ==
:
比较数组
var method = type.GetMethods().FirstOrDefault(m =>
m.Name == name && m.GetParameters().Select(p => p.ParameterType).SequenceEqual(argTypes));
在 dotnet core 之前我们可以做到
var member = type.GetMethod(name, bindingFlags, null, argtypes, null);
为了访问与其名称和参数类型匹配的方法,在 dotnet 核心中他们删除了这个重载,现在我只能通过 name && binding flags
或 name && parameters type
(see) , 但不像以前那样。
有一个新方法 GetRuntimeMethods,其中 returns IEnumerable<MethodInfo>
包括非 public 方法,但我无法按参数类型过滤。
还有另一种方法 GetRuntimeMethod,我可以按参数类型过滤,但它不包括非 public 方法。
我已经尝试过类似的方法,但失败了
var member = type.GetRuntimeMethods().Where(m =>
m.Name == name && (m.GetParameters().Select(p => p.GetType()).ToArray() == argtypes)).FirstOrDefault();
有没有办法通过名称和参数类型获取方法?
是的,确实缺少那个过载。您可以使用的是 GetMethods()
并按照您想要的方式过滤输出。您的尝试很接近,除了您不能使用 ==
:
var method = type.GetMethods().FirstOrDefault(m =>
m.Name == name && m.GetParameters().Select(p => p.ParameterType).SequenceEqual(argTypes));