如何使c#加载类尽可能泛型化
本文关键字:尽可能 泛型 加载 何使 | 更新日期: 2023-09-27 18:11:43
我有这个类,它应该接收一个控件,设置一个新的PictureBox(加载gif)并启动一个新的BackGroundWorker。我需要传递一个函数/方法BackGroundWorker.DoWork()工作,然后关闭线程一旦它完成。我的问题是,我不知道如何使这个尽可能通用。现在我想传递一个有1个参数的函数,但是明天我可能需要传递2个参数,或者根本没有参数(void)。
任何帮助都将不胜感激。
坦克 class Loading
{
private BackgroundWorker _bw = new BackgroundWorker();
private Control _control { get; set; }
private PictureBox _pic = new PictureBox() { Image = Properties.Resources.loading};
public Loading(Control control, VERY GENERIC METHOD)
{
_control = control;
_bw.DoWork += (sender, e) =>
{
_control.Invoke(new EventHandler(StartLoading));
};
_bw.RunWorkerCompleted += (sender, e) =>
{
_control.Invoke(new EventHandler(StopLoading));
};
_bw.WorkerSupportsCancellation = true;
}
private void StartLoading(object sender, EventArgs e)
{
_control.Controls.Add(_pic);
_bw.RunWorkerAsync();
}
private void StopLoading(object sender, EventArgs e)
{
this.Dispose();
_control.Controls.Remove(_pic);
}
}
接受Action
。这里的代码不需要传递给方法的信息,也不需要结果。如果调用者有他们想在委托的实现中使用的变量,他们可以使用lambda来关闭他们端的变量。
很简单:
new Loading(someControl, () => SomeMethod(someVariable, someOtherVariable));
这是你想要的吗?
public Loading(Control control, Action work)
{
_control = control;
_bw.DoWork += (sender, e) =>
{
_control.Invoke(new EventHandler(StartLoading));
work();
};
_bw.RunWorkerCompleted += (sender, e) =>
{
_control.Invoke(new EventHandler(StopLoading));
};
_bw.WorkerSupportsCancellation = true;
}
你可以使用。net ThreadPool使用的模式,并使"VERY GENERIC METHOD"成为一个接受对象作为单个参数的泛型方法。该方法需要知道对象是什么以及将其强制转换为什么。