【问题标题】:MethodInfo invoke for Overloaded methods in C#MethodInfo 调用 C# 中的重载方法
【发布时间】:2015-11-22 00:33:58
【问题描述】:

我正在使用 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 个参数调用发送,但它抛出错误。

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(对象 obj,对象 [] 参数) 在 e:\sample\BDw.cs:line 146 中的 Download.BasicDownload.BasicFileDownload(Device device)

【问题讨论】:

  • 见this,你必须先找到合适的方法(GetMethod是第二个参数,指定类型数组)。
  • 您在代码中使用了两个不同的 MethodInfo 对象。 methodOpen 用于 methodSend 中的 Send 方法以外的其他内容。这可能是您的问题,除非您只是打错了字。

标签: c#


【解决方案1】:

你可以通过签名直接得到正确的Send方法。

var signature = new[] {typeof (byte[]), typeof (int), typeof (int), typeof (int)};
MethodInfo methodSend = deviceType.GetMethod("Send", signature);

这比使用反射获取所有类型的方法然后过滤它们更有效。

您的代码不起作用,因为 Reflection 返回的方法顺序不一定与您在代码中声明它们的顺序相同。

【讨论】:

  • 不客气。请记住将其中一个答案标记为正确答案,Bharani。
【解决方案2】:

你也可以查看参数计数..

MethodInfo methodSend = deviceType.GetMethods()
                        .Where(m => m.Name == "Send" && m.GetParameters().Length==4).First();

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

【讨论】:

    【解决方案3】:

    您实际上应该在 methodInfo 上调用 GetParameters 方法。这将为您提供该方法的正确参数

    ParameterInfo[] Meth_Params = methodOpen.GetParameters(); dynamic[] inputparams = new dynamic[Meth_Params.Length]; inputparams[0] = first parameter;

    等等……

    然后将参数数组分配给调用 object invokeSend = methodOpen.Invoke(device, inputparams);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多