A-D*_*xic 4 c# arrays delegates winforms
我试图使用this.Invoke()从一个单独的线程访问我的窗体上的控件.我正在调用一个委托,指向一个以字符串[]为参数的方法.
关于我的代表声明的几行:
public delegate void delVoidStringArray(string[] s);
public delVoidStringArray _dLoadUserSelect = null;
_dLoadUserSelect = LoadUsers;
Run Code Online (Sandbox Code Playgroud)
从单独的线程调用委托:
Invoke(_dLoadUserSelect, sUsernames);
Run Code Online (Sandbox Code Playgroud)
并且该方法被调用以处理表单上的控件
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;
}
Run Code Online (Sandbox Code Playgroud)
这通常与我的其他代理一起使用各种参数(字符串,控件,表单和无参数),但每当我调用此Invoke()行时,我都会收到错误:"参数计数不匹配".
我认为发生的事情是我的字符串数组被装入一个对象数组,并且委托试图将这些字符串作为单独的参数传递给该方法.因此,如果字符串数组具有"Bob""Sally"和"Joe",则它会尝试将LoadUsers调用为
LoadUsers("Bob", "Sally", "Joe");
Run Code Online (Sandbox Code Playgroud)
这显然与签名不符.
这听起来像是可能发生的事吗?我怎么能解决这个问题?
假设sUsernames是,string[]那么你需要调用它
Invoke(_dLoadUserSelect, new object[] { sUsernames });
Run Code Online (Sandbox Code Playgroud)
.Net数组是协变的,所以这个赋值是有效的:
string[] sUsernames = new[] { "a", "b", "c" };
object[] objs = sUsernames;
Run Code Online (Sandbox Code Playgroud)
当使用params参数调用方法时,数组直接传递,而不是作为参数数组中的第一个元素传递.您需要手动创建参数数组Invoke以获取您期望的行为.