C#中重载方法的MethodInfo invoke方法

4

我正在使用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[] parameters, CultureInfo culture) 中 在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 中 在 System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters) 中 在 Download.BasicDownload.BasicFileDownload(Device device) in e:\sample\BDw.cs:line 146


1
请查看此链接,您需要先找到适当的方法(对于GetMethod,它是第二个参数,指定类型数组)。 - Sinatr
你的代码中使用了两个不同的MethodInfo对象。methodOpen用于methodSend中的某些内容,而非Send方法本身。除非你只是犯了一个打字错误,否则这可能是问题所在。 - Russ
3个回答

4
您可以通过其签名直接获得正确的Send方法。
var signature = new[] {typeof (byte[]), typeof (int), typeof (int), typeof (int)};
MethodInfo methodSend = deviceType.GetMethod("Send", signature);

使用这种方法比使用反射获取所有类型的方法,然后进行过滤更加高效。

你的代码无法正常工作,因为反射返回的方法顺序不一定与你在代码中声明的顺序相同。


不用谢。记得将其中一个答案标记为正确的,Bharani。 - Joel V. Earnest-DeYoung

2
您可以检查参数计数。
MethodInfo methodSend = deviceType.GetMethods()
                        .Where(m => m.Name == "Send" && m.GetParameters().Length==4).First();

如果您的情况比这更复杂,您可能还需要检查参数类型...


0
你实际上应该在methodInfo上调用GetParameters方法。这将为您提供方法所需的正确参数。
ParameterInfo[] Meth_Params = methodOpen.GetParameters(); dynamic[] inputparams = new dynamic[Meth_Params.Length]; inputparams[0] = 第一个参数;
然后将参数数组分配给invoke对象 object invokeSend = methodOpen.Invoke(device, inputparams);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接