C#反射报错之System.Reflection.AmbiguousMatchException:“Ambiguous match found.
.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 方法及其参数类型。根据实际需求,你可以进一步筛选和处理这些方法。