MethodInfo为C#中的重载方法调用

时间:2015-08-27 14:45:41

标签: c#

我正在使用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行

3 个答案:

答案 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);