参数错误

时间:2014-02-12 18:33:47

标签: c# delegates

我收到此错误(翻译自德语): System.Windows.Forms.dll中出现类型“System.Reflection.TargetParameterCountException”的异常(第一次机会)。

我的代码:

        private async void ClientLogedIn(object sender, string username, string ipAddress)
    {
        PVPNetConnect.RiotObjects.Platform.Clientfacade.Domain.LoginDataPacket LoginData = await pvp.GetLoginDataPacketForUser();
        PVPNetConnect.RiotObjects.Platform.Summoner.AllSummonerData AllSummonerData = LoginData.AllSummonerData;
        PVPNetConnect.RiotObjects.Platform.Summoner.Summoner Summoner = AllSummonerData.Summoner;
        Invoke(new AddDelegate(Add), new string[] { "Dd", "ee", "ff" });
    }

代表+无效:

        private delegate void AddDelegate(String[] vars);
    private void Add(string[] vars)
    {
        var li = new ListViewItem(vars);
        listView1.Items.Add(li);
    }

2 个答案:

答案 0 :(得分:3)

您需要将数组包装到对象数组的第一个元素中:

Invoke(new AddDelegate(Add), new object[] { new string[] { "Dd", "ee", "ff" } });

请注意,使用lambda通常更容易编写,因为您无需担心委托声明或管理对象数组:

Invoke(new Action( () => Add(new[] { "Dd", "ee", "ff" }));

答案 1 :(得分:1)

因为Invoke使用params作为第二个参数,你可以提供N个不同的参数并将它们全部包装在一个数组中,或者你可以只提供一个数组传入的所有参数。在这里,你的字符串数组被解释为含义"传入三个参数,每个参数类型为字符串",这不是你想要的,你想要传递一个string[]类型的参数。要做到这一点,只需确保参数的编译时类型不是数组,这可以通过简单的强制转换完成:

Invoke(new AddDelegate(Add), (object)new string[] { "Dd", "ee", "ff" });