C# 使用Type.GetMethod(字符串名称,类型[]类型)的意外行为
考虑以下代码:C# 使用Type.GetMethod(字符串名称,类型[]类型)的意外行为,c#,.net,C#,.net,考虑以下代码: public static class FooHelpers { public static void Foo(int bar) { //... } public static void Foo(uint bar) { //... } public static void Foo(long bar) { //... } public static voi
public static class FooHelpers
{
public static void Foo(int bar)
{
//...
}
public static void Foo(uint bar)
{
//...
}
public static void Foo(long bar)
{
//...
}
public static void Foo(ulong bar)
{
//...
}
}
现在我有了一些给定类型的反射代码,并检查是否存在具有给定类型参数的Foo
方法。如果不存在这样的Foo
方法,我的程序需要跳过一步。以下是实现此目的的方法:
public static MethodInfo GetFooMethodIfExists(Type parameterType)
{
return typeof(FooHelpers).GetMethod("Foo", new Type[] { parameterType });
}
这似乎是一个合理的解决方案,不是吗?根据Type.GetMethod(字符串名称,Type[]types)
上的文档:
现在,让我们尝试以下操作:
MethodInfo m = GetFooMethodIfExists(typeof(short));
它没有返回null,而是返回带有int
参数的方法。我刚刚完成了一个重反射的项目,该项目依赖于Type.GetMethod(string name,Type[]types)
的输出作为文档状态,这导致了很多问题
有人能告诉我为什么会发生这种情况和/或解释一种不同的方法吗?将解决您的问题。基本上,它强制反射对参数类型严格。以下是如何修复使用此标志的方法:
public static MethodInfo GetFooMethodIfExists(Type parameterType)
{
return typeof (FooHelpers).GetMethod(
"Foo",
BindingFlags.Static | BindingFlags.Public | BindingFlags.ExactBinding,
(Binder) null,
new[] {parameterType},
(ParameterModifier[]) null);
}
谢谢,一切都解决了:)
public static MethodInfo GetFooMethodIfExists(Type parameterType)
{
return typeof (FooHelpers).GetMethod(
"Foo",
BindingFlags.Static | BindingFlags.Public | BindingFlags.ExactBinding,
(Binder) null,
new[] {parameterType},
(ParameterModifier[]) null);
}