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