【发布时间】:2018-02-15 23:52:25
【问题描述】:
我多年来一直在这个项目上使用KendoDynamicLinq 库,没有任何问题。我开始在同一个项目/代码上使用 VS 2017 社区版而不是 VS 2013,如果我使用 VS 2017 运行项目,我会收到以下异常:
System.Reflection.TargetException: 'Non-static method requires a target.'
但如果我用 VS 2013 运行它,没问题,没有例外,一切正常。
我一直在为此绞尽脑汁,但似乎找不到答案。任何指向我的帮助或方向将不胜感激。
private static MethodInfo GetMethod(string methodName, MethodInfo methodTypes, int genericArgumentsCount)
{
var methods = from method in typeof(Queryable).GetMethods(BindingFlags.Public | BindingFlags.Static)
let parameters = method.GetParameters()
let genericArguments = method.GetGenericArguments()
where method.Name == methodName &&
genericArguments.Length == genericArgumentsCount &&
parameters.Select(p => p.ParameterType).SequenceEqual((Type[])methodTypes.Invoke(null, genericArguments))
select method;
return methods.FirstOrDefault();
}
抛出的线是这样的:
parameters.Select(p => p.ParameterType).SequenceEqual((Type[])methodTypes.Invoke(null, genericArguments))
您是否在这里看到任何可以在 VS2013 中使用但在 VS 2017 中无法使用的东西。解决方案或目标框架没有变化。
【问题讨论】:
-
问题其实出在传递methodTypes的GetMethod的调用者身上。他们应该选择静态方法并选择实例方法。就在我的脑海中,C# 编译器发生了变化,在那个时间范围内,将某些类型的 lambda 表达式从静态方法更改为单例闭包类的实例方法。
-
谢谢,我会研究一下,很难说,这个库接收一个 IQuarable 集合并应用来自 UI Kendo 网格的过滤器和聚合器。在这种情况下,它是某个字段的总和。不知道有什么方法以及如何拦截它。我会调查更多的帖子发现。
-
如果你从 VS 2017 的源代码重新编译这个库,那么它是有意义的。描述了导致该问题的 C# 编译器的底层更改here。
标签: c# visual-studio-2013 visual-studio-2017 system.reflection