发现不明确的匹配异常



在从net core 3.1升级到.NET 5之前,这个曾经工作得很好

产生错误的扩展方法是

public static IQueryable Set(this myContext context, Type T)
{
MethodInfo method = typeof(myContext).GetMethod(nameof(myContext.Set), BindingFlags.Public | BindingFlags.Instance);
method = method.MakeGenericMethod(T);
return method.Invoke(context, null) as IQueryable;
}

尤其是这条

MethodInfo method = typeof(myContext).GetMethod(nameof(myContext.Set), BindingFlags.Public | BindingFlags.Instance);

堆栈跟踪是

at System.RuntimeType.GetMethodImplCommon(String name, Int32 genericParameterCount, BindingFlags bindingAttr, Binder binder, CallingConventions callConv, Type[] types, ParameterModifier[] modifiers)
at System.RuntimeType.GetMethodImpl(String name, BindingFlags bindingAttr, Binder binder, CallingConventions callConv, Type[] types, ParameterModifier[] modifiers)
at System.Type.GetMethod(String name, BindingFlags bindingAttr)
at Extensions.QueryableExtensions.Set(RetailContext context, Type T, Boolean dummy) in QueryableExtensions.cs:line 36

这个模棱两可的错误是从哪里来的?

DbContext.Set方法有两个重载。你需要告诉反思是哪一个。

https://learn.microsoft.com/en-us/dotnet/api/system.data.entity.dbcontext.set?view=entity-框架-5.0.0

例如

MethodInfo method = typeof(myContext).GetMethod(nameof(myContext.Set), Array.Empty<Type>());
MethodInfo method = typeof(myContext).GetMethod(nameof(myContext.Set), new Type[] { typeof(string) });

我删除了BindingFlags.Public | BindingFlags.Instance参数,因为这是默认值。如果你正在寻找一个非公共方法,你可以使用其中一个重载,但我相信它们也需要一些其他参数。

第三个选项是使用GetMethods调用,然后使用linq来选择正确的方法。

例如

typeof(myContext).GetMethods(/*Can add binding flags if needed*/).First(w => w.Name == nameof(myContext.Set) && w.GetParameters().Count() == 0 /* Or some other condition to disambiguate the function*/)

最新更新