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
多年来我一直在这个项目上使用 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