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