繁体   English   中英

System.Reflection.TargetException:'非静态方法需要目标。 仅适用于VS 2017而不适用于VS 2013

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

我多年来一直在这个项目上使用KendoDynamicLinq库,没有任何问题。 我开始在同一项目/代码上使用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()方法添加了一个参数,该参数采用一个对象,如果该方法是静态的,则该对象将为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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM