System.Reflection.TargetException:'Non-static method requires a target.' 仅适用于 VS 2017,不适用于 VS 2013

System.Reflection.TargetException: 'Non-static method requires a target.' only with VS 2017 not with VS 2013

多年来我一直在这个项目上使用 KendoDynamicLinq 库,没有任何问题。我开始在同一个 project/code 上使用 VS 2017 Community Edition 而不是 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 上工作的东西吗?解决方案或目标框架没有变化。

感谢 mike z 为我指明了正确的方向。 我现在正在检查传入的 methodTypes 是否是静态的,如果它是静态的,我现在将 null 作为目标对象传入。但如果它不是静态的,那么我会创建一个对象的实例并将其传递给它。这是新的调用代码:

var m = ((Func<Type, Type[]>)this.GetType().GetMethod("SumAvgFunc", BindingFlags.Static | BindingFlags.NonPublic)
                        .MakeGenericMethod(proptype).Invoke(null, null)).GetMethodInfo();
                    object obj = null;
                    if (!m.IsStatic)
                    {
                        obj = Activator.CreateInstance(m.DeclaringType);
                    }
                    return GetMethod(aggregate, m, 1, obj).MakeGenericMethod(type);

所以我向 GetMethod() 方法添加了一个参数,该方法接受一个对象,如果该方法是静态的,该对象将为空,否则它将是 class 方法所属的一个实例。这是 GetMethod :

private static MethodInfo GetMethod(string methodName, MethodInfo methodTypes, int genericArgumentsCount, object obj)
        {
            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(obj, genericArguments))
                          select method;
            return methods.FirstOrDefault();
        }

现在一切正常,就像之前使用 VS 2013 时一样。 谢谢迈克 z