代码之家  ›  专栏  ›  技术社区  ›  Gojira

为什么方法调用失败并出现参数异常?

  •  3
  • Gojira  · 技术社区  · 7 年前

    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                object[] parms = new object[1];
                parms[0] = "foo";
    
                DoSomething(parms);
            }
    
            public static string DoSomething(object[] parms)
            {
                Console.WriteLine("Something good happened");
                return null;
            }
        }
    

    当您单击时,它会按预期工作 它在控制台上打印“发生了什么好事”。

    现在考虑这个代码示例,除了调用 DoSomething

    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                object[] parms = new object[1];
                parms[0] = "foo";
    
                System.Reflection.MethodInfo mi = typeof(Form1).GetMethod("DoSomething");
                mi.Invoke(null, parms);
    
            }
    
            public static string DoSomething(object[] parms)
            {
                Console.WriteLine("Something good happened");
                return null;
            }
        }
    

    它抛出一个 System.ArgumentException 在线上 mi.Invoke(null, parms)

    parms显然是一个对象数组,DoSomething的方法签名显然期望一个对象数组。那么,为什么invoke将第一个对象从数组中拉出,并尝试传递它呢?

    还是发生了其他我不理解的事情?

    4 回复  |  直到 7 年前
        1
  •  7
  •   Servy    7 年前

    MethodInfo.Invoke 。对象数组中的第一个参数是第一个参数,数组中的第二个对象是第二个方法,等等。

    因为您希望方法的第一个参数是 object[] MethodInfo.Invoke 是一个对象数组 DoSomething 应该使用。

        2
  •  2
  •   Marc Gravell    7 年前
    object[] parms = new object[1];
    parms[0] = "foo";
    

    使用:

    public static string DoSomething(object[] parms)
    

    string -这是一个 object[] 对象[] 你传给的 Invoke 代表 每个参数依次 ,所以 对象[] static string DoSomething(string s) ,但与您的方法不匹配。更改签名或包装值。坦率地说,我建议在这里更改签名是更好的主意,但是:

    parms[0] = new object[] { "foo" };
    

    也会起作用

        3
  •  1
  •   Gusman    7 年前

    MethodInfo.Invoke 期望一个对象数组作为参数将多个参数传递给函数,数组中的每个对象都将是不同的参数。

    由于函数还需要一个对象数组,所以作为参数传递的不是对象数组,而是字符串。

    mi.Invoke(null, new object[]{ parms });
    
        4
  •  1
  •   CodingYoshi    7 年前

    是的,它需要一个对象数组。但是当你通过这个:

    object[] parms = new object[1];
    

    DoSomething 所以parms[0]是 剂量测定法 parms

    显然,第一个论点是 剂量测定法 不是一个 string