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



我在这个项目上使用了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中不使用的任何东西。解决方案或目标框架没有更改。

谢谢迈克·Z(Mike Z(将我指向正确的方向。现在,我正在检查传递的方法类型是否静态,并且是否是静态的,我现在作为目标对象传递了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((方法中添加了一个参数,该方法采用一个对象,如果该方法为静态,则将是null的,否则它将是类方法为构件的类的实例。这是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上工作。谢谢Mike Z

最新更新