2016-06-02 2 views
3

Рассмотрим следующий код:Неожиданное поведение с помощью Type.GetMethod (имя строки, тип [] типы)

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

Вместо возвращения нулевой, то он возвращается метод с параметром int. Я только что закончил проект с отражением, который полагался на результат Type.GetMethod(string name, Type[] types), чтобы вести себя как состояние документации, и это вызывает множество проблем.

Может кто-нибудь скажет мне, почему это происходит и/или объясняет другой способ сделать это?

ответ

4

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

Спасибо, что исправлено все :) –