请考虑以下代码:
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 });
}
似乎是合理的解决方案,不是吗?根据{{1}}上的文档:
Type.GetMethod(string name, Type[] types)
现在,让我们尝试以下方法:
// Returns:
// A System.Reflection.MethodInfo object representing the public method whose
// parameters match the specified argument types, if found; otherwise, null.
它返回带有MethodInfo m = GetFooMethodIfExists(typeof(short));
参数的方法,而不是返回null。我刚刚完成了一个反思繁重的项目,该项目依赖于int
的输出来表现为文档状态,并且它导致了很多问题。
任何人都可以告诉我为什么会发生这种情况和/或解释一种不同的方式吗?
答案 0 :(得分:5)
BindingFlags.ExactBinding会解决您的问题。基本上,它强制反射对参数类型是严格的。以下是修复方法以使用此标志的方法:
public static MethodInfo GetFooMethodIfExists(Type parameterType)
{
return typeof (FooHelpers).GetMethod(
"Foo",
BindingFlags.Static | BindingFlags.Public | BindingFlags.ExactBinding,
(Binder) null,
new[] {parameterType},
(ParameterModifier[]) null);
}