Как вызвать перегруженный метод, используя отражение в c#. AmbiguousMatchException - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь вызвать перегруженный метод, используя отражение.

public void SomeMethod(string param)
{
    param = param.Length > 0 ? param : null;
    Type thisType = this.GetType();
    MethodInfo theMethod = thisType.GetMethod("methodName", BindingFlags.NonPublic | BindingFlags.Instance);
    theMethod.Invoke(this, param);
}

Когда я использую один из обоих методов, все работает хорошо:

//works well if param = "" (null)
private void methodName(){
}

//works well if param = "anystring"
private void methodName(string parameter){
}

Я могу использовать только один из этих методов. Но когда я использую оба метода в классе (мне нужно использовать оба случая - когда параметр будет передан и без него), я получаю исключение:

AmbiguousMatchException: найдено неоднозначное совпадение

Как использовать оба перегруженных метода?

Ответы [ 2 ]

1 голос
/ 16 марта 2020

Вы можете проверить число параметров methodName , если оно равно или больше 0 , например, следующий код:

public void SomeMethod(string param)
{
    Type thisType = this.GetType();

    if (!string.IsNullOrEmpty(param))
    {
        MethodInfo theMethod1 = thisType.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
        .FirstOrDefault(m => m.Name == "methodName" && m.GetParameters().Count() > 0);

        theMethod1.Invoke(this, new[] { param });
    }
    else
    {
        MethodInfo theMethod2 = thisType.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
        .FirstOrDefault(m => m.Name == "methodName" && m.GetParameters().Count() == 0);

        theMethod2.Invoke(this, null);
    }
}

Я надеюсь, что это будет помочь вам решить проблему

1 голос
/ 16 марта 2020

Вы должны использовать эту перегрузку метода GetMethod, чтобы найти подходящий метод methodName. Эта перегрузка учитывает количество аргументов метода и его типы. Используя этот метод перегрузки, SomeMethod следует переписать так:

public void SomeMethod(string param)
{
    Type thisType = GetType();

    if (!string.IsNullOrEmpty(param))
    {
        // Find and invoke method with one argument.
        MethodInfo theMethod = thisType.GetMethod("methodName", BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] {typeof(string)}, null);
        theMethod.Invoke(this, new object[] {param});
    }
    else
    {
        // Find and invoke method without arguments.
        MethodInfo theMethod = thisType.GetMethod("methodName", BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[0], null);
        theMethod.Invoke(this, null);
    }
}

Вот пример использования этого подхода: https://dotnetfiddle.net/efK1nt.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...