我在这个项目上使用了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中不使用的任何东西。解决方案或目标框架没有更改。
谢谢迈克·Z(Mike Z(将我指向正确的方向。现在,我正在检查传递的方法类型是否静态,并且是否是静态的,我现在作为目标对象传递了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