hhrzc
hhrzc

Reputation: 2050

How to call the overloaded method using reflection in c#. AmbiguousMatchException

I try to call overloaded method using reflection.

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

When I use one of both method all works well:

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

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

I can use only one of those methods. But when I use both methods in the class (I need to use both cases - when param will be passed and without him) I get the exception:

AmbiguousMatchException: Ambiguous match found

How to can I use both overloaded methods?

Upvotes: 0

Views: 429

Answers (2)

Iliar Turdushev
Iliar Turdushev

Reputation: 5213

You should use this overload of the method GetMethod to find appropriate method methodName. This overload takes to account number of method arguments and its types. Using this overload method SomeMethod should be rewritten like this:

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

Here is a sample of using this approach: https://dotnetfiddle.net/efK1nt.

Upvotes: 1

Mohammed Sajid
Mohammed Sajid

Reputation: 4903

You can test on parameters number of methodName, if is equal or greater than 0, like the following code :

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

I hope this will help you fix the issue

Upvotes: 1

Related Questions