gpt4 book ai didi

以字符串数组作为参数的 C# Invoke() 委托(delegate) (winforms)

转载 作者:太空狗 更新时间:2023-10-30 01:06:01 25 4
gpt4 key购买 nike

我试图从一个单独的线程使用 this.Invoke() 来访问我的表单上的控件。我正在调用一个委托(delegate),该委托(delegate)指向一个以字符串 [] 作为参数的方法。

关于我的委托(delegate)声明的几行:

public delegate void delVoidStringArray(string[] s);
public delVoidStringArray _dLoadUserSelect = null;
_dLoadUserSelect = LoadUsers;

从单独的线程调用委托(delegate):

Invoke(_dLoadUserSelect, sUsernames);

调用窗体控件的方法

private void LoadUsers(string[] users)
{
//Load the list of users into a ListBox
lstUsers.Items.AddRange(users);

//Load the state of a CheckBox on the form
chkUserAlways.Checked = Properties.Settings.Default.PreferDefaultUser;
}

这通常适用于带有各种参数(字符串、控件、表单和无参数)的其他委托(delegate),但每当我调用此 Invoke() 行时,我都会收到错误消息:“参数计数不匹配。”

我认为正在发生的事情是我的字符串数组被装箱到一个对象数组中,委托(delegate)试图将这些字符串作为单独的参数传递给该方法。因此,如果字符串数组包含“Bob”、“Sally”和“Joe”,它会尝试将 LoadUsers 调用为

LoadUsers("Bob", "Sally", "Joe");

这显然与签名不匹配。

这听起来像是可能发生的事情吗?我该如何解决这个问题?

最佳答案

假设 sUsernames 是一个 string[] 那么是的,你需要调用它

Invoke(_dLoadUserSelect, new object[] { sUsernames });

.Net 数组是协变的,所以这个赋值是有效的:

string[] sUsernames = new[] { "a", "b", "c" };
object[] objs = sUsernames;

并且当使用 params 参数调用方法时,数组被直接传递,而不是作为参数数组中的第一个元素传递。您需要为 Invoke 手动创建参数数组以获得您期望的行为。

关于以字符串数组作为参数的 C# Invoke() 委托(delegate) (winforms),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16725374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com