[英]What does System.Reflection.TargetException: Non-static method requires a target. mean?
[英]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.