System.Reflection.TargetException:'非静态方法需要一个目标。'仅限VS 2017而不是VS 2013

时间:2018-02-15 23:52:26

标签: c# visual-studio-2013 visual-studio-2017 system.reflection

我在这个项目上使用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中没有。没有改变解决方案或目标框架。

1 个答案:

答案 0 :(得分:0)

谢谢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