使用Type.GetMethod(字符串名称,类型[]类型)的意外行为

时间:2016-06-02 15:09:41

标签: 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 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的输出来表现为文档状态,并且它导致了很多问题。

任何人都可以告诉我为什么会发生这种情况和/或解释一种不同的方式吗?

1 个答案:

答案 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);
}