在从.NET 5升级到net core 3.1之前,这个曾经工作得很好。
生成错误的扩展方法是
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这个模棱两可的错误从何而来?
发布于 2022-08-04 02:29:55
DbContext.Set方法有两个重载。你需要告诉反射是哪一个。
例如。
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*/)https://stackoverflow.com/questions/73152427
复制相似问题