System.Reflection.AmbiguousMatchException: '找到了模糊匹配。'

22
我正在尝试从方法TableExists<T>获取MethodInfo,以便可以使用类型来调用它。
该方法声明在OrmLiteSchemaApi类内部。有两个重载版本:
public static bool TableExists<T>(this IDbConnection dbConn)
{
  // code omitted
}

public static bool TableExists(this IDbConnection dbConn, string tableName, string schema = null)
{
  // code omitted
}

我正在尝试以如下方式获取MethodInfo:

var tableMethod = typeof(OrmLiteSchemaApi).GetMethod("TableExists");

但它会生成异常:

System.Reflection.AmbiguousMatchException: '找到了多个匹配项。'

我只能找到一个与之相关的旧问题,建议将空对象数组作为参数传递,但这对 .net core 不起作用。

我猜我需要指定具体的重载,但我不确定怎么做。

如何获取 MethodInfo


1
要清楚,您正在尝试获取第一个重载吗?您需要传递该参数的类型(它是扩展方法并不改变第一个参数是“IDbConnection”类型的事实)。 - Joe Sewell
这个回答解决了你的问题吗?避免模糊匹配异常 - undefined
2个回答

29

你可以使用GetMethods(复数!)获取所有匹配方法的数组,然后查找具有IsGenericMethod的方法:

var tm = typeof(OrmLiteSchemaApi)
        .GetMethods()
        .Where(x => x.Name == "TableExists")
        .FirstOrDefault(x => x.IsGenericMethod);

我建议使用这种方法而不是使用参数说明符,因为如果出现任何问题,它将为您提供一个可以在调试时逐步查看的对象。


6
传递一个空的对象数组只有在你要查找没有参数的函数时才有效。相反,你需要使用另一种重载的GetMethod,将参数类型指定为类型数组。这样,你可以通过指定应该查找哪些类型的参数来告诉它要获取哪个引用。

GetMethod(string)将返回一个带有参数的方法。异常并不是因为该方法有参数,而是因为存在两个同名的方法。但解决方案仍然相同。 - Scott Hannen
@ScottHannen,没错。我指的是原帖中尝试传递一个空对象数组的解决方案。这不会返回正确的值,因为被搜索的方法有一个参数。 - Louis Ingenthron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接