我正在使用MethodInfo来调用一个重载的方法,这个方法会给我一个异常的TargetParameterCount不匹配,下面是我的代码
public class Device
{
public bool Send(byte[] d, int l, int t)
{
return this.Send(d, 0, l, t);
}
public bool Send(byte[] d, int l, int t,int t)
{
return true;
}
}
我在另一个班级,我称这些功能。
public class dw
{
public bool BasicFileDownload(Device device)
{
Type devType = device.GetType();
byte [] dbuf = readbuff();
MethodInfo methodSend = deviceType.GetMethods().Where(m => m.Name =="Send").Last();
object invokeSend = methodOpen.Invoke(device, new object[] {dbuf,0,10,100 });
}
}
现在我正在尝试使用4个参数调用Send,但它会抛出错误。
System.Reflection.TargetParameterCountException:参数计数不匹配。 在System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj,BindingFlags invokeAttr,Binder binder,Object []参数,CultureInfo文化) 在System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object []参数,CultureInfo文化) 在System.Reflection.MethodBase.Invoke(Object obj,Object []参数) 在e:\ sample \ BDw.cs中的Download.BasicDownload.BasicFileDownload(设备设备):第146行
答案 0 :(得分:3)
您可以通过签名直接获取正确的Send方法。
var signature = new[] {typeof (byte[]), typeof (int), typeof (int), typeof (int)};
MethodInfo methodSend = deviceType.GetMethod("Send", signature);
这比使用Reflection获取所有类型的方法然后过滤它们更有效。
您的代码不起作用,因为Reflection返回的方法顺序不一定与您在代码中声明它们的顺序相同。
答案 1 :(得分:2)
您还可以查看参数计数..
MethodInfo methodSend = deviceType.GetMethods()
.Where(m => m.Name == "Send" && m.GetParameters().Length==4).First();
如果您的案例比这更复杂,您可能还需要检查参数类型......
答案 2 :(得分:0)
实际上你应该在methodInfo上调用GetParameters方法。这将为您提供方法
的正确参数 ParameterInfo[] Meth_Params = methodOpen.GetParameters();
dynamic[] inputparams = new dynamic[Meth_Params.Length];
inputparams[0] = first parameter;
依旧......
然后将参数数组赋给调用 object invokeSend = methodOpen.Invoke(device,inputparams);