C#反射报错之System.Reflection.AmbiguousMatchException:“Ambiguous match found.

发布时间 2023-08-08 21:10:11作者: JohnYang819

.NET6 Type t = typeof(double).GetMethod("TryParse").GetParameters()[1].ParameterType;
Console.WriteLine(t.Name);报错System.Reflection.AmbiguousMatchException:“Ambiguous match found.”
这个错误通常是因为在使用反射时存在方法重载,导致无法确定要获取哪个重载方法的参数信息。在这个特定的例子中,.GetMethod("TryParse") 可能匹配到多个重载版本的 TryParse 方法。

double.TryParse 方法有多个重载,每个重载版本的参数个数和类型都可能不同,这就导致了上述代码中的歧义性匹配。要解决这个问题,你可以通过获取特定版本的 TryParse 方法,或者通过进一步精确指定方法的参数类型来避免歧义性匹配。

以下是两种可能的解决方法:
方法1:获取特定版本的 TryParse 方法

可以通过指定参数类型来获取特定版本的 TryParse 方法,避免歧义性匹配。例如,假设你想要获取接受 string 和 out double 参数的 TryParse 方法,可以这样做:

Type[] parameterTypes = { typeof(string), typeof(double).MakeByRefType() };
MethodInfo tryParseMethod = typeof(double).GetMethod("TryParse", parameterTypes);

if (tryParseMethod != null)
{
    Type t = tryParseMethod.GetParameters()[1].ParameterType;
    Console.WriteLine(t.Name); // 输出 "Double&"
}
else
{
    Console.WriteLine("Method not found.");
}


方法2:获取所有 TryParse 方法并进一步处理

你也可以获取所有重载版本的 TryParse 方法,然后根据参数的个数和类型来进一步处理。以下是一个示例代码,展示如何获取所有 TryParse 方法并输出其参数类型:

MethodInfo[] tryParseMethods = typeof(double).GetMethods()
    .Where(method => method.Name == "TryParse")
    .ToArray();

foreach (MethodInfo method in tryParseMethods)
{
    ParameterInfo[] parameters = method.GetParameters();
    if (parameters.Length == 2)
    {
        Type t = parameters[1].ParameterType;
        Console.WriteLine($"{method.Name}({parameters[0].ParameterType.Name}, {t.Name})");
    }
}


这将输出所有符合参数个数为 2 的 TryParse 方法及其参数类型。根据实际需求,你可以进一步筛选和处理这些方法。