c# - 为什么方法调用会因参数异常而失败?

标签 c# reflection invoke

考虑来自 WinForms 应用程序的代码示例:

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;
        }
    }

它按预期工作,当您单击 button1 时,它会在控制台上打印“Something good happened”。

现在考虑这个代码示例,除了它使用反射调用 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;
        }
    }

它在 mi.Invoke(null, parms) 行抛出 System.ArgumentException(“System.String”类型的对象无法转换为“System”类型.Object[]'.)

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

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

最佳答案

MethodInfo.Invoke 需要一个对象数组,其中对象数组中的每个对象对应于方法的一个参数。对象数组中的第一个参数是第一个参数,数组中的第二个对象是第二个方法,等等。

由于您希望方法的第一个参数是 object[],因此您需要确保传递给 MethodInfo.Invoke 的对象数组中的第一个对象> 是一个对象数组,表示 DoSomething 应该使用的数组。

关于c# - 为什么方法调用会因参数异常而失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45338276/

相关文章:

C#方法通用params参数错误?

c# - 提高 EF 查询性能 - 检查预取列表中是否存在行 <string>

c# - 从数据库创建按钮 - 发生 System.NullReferenceException

objective-c - 如何从objective-c类型编码中获取字节大小

C#/WinForms : ShowDialog and subsequent Show on Form

c# - 在 "null"引用(即没有订阅者的事件)上调用扩展方法是邪恶的吗?

java - 获取对象的类及其构造函数,Android中的Reflection

c# - 以编程方式调用按钮的单击方法

c# - 在打开表单之前使用 Invoke 时出现 InvalidOperationException

java - 如何获取代理类上的方法注释?