如何使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);
    }

}

如何使c#加载类尽可能泛型化

接受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"成为一个接受对象作为单个参数的泛型方法。该方法需要知道对象是什么以及将其强制转换为什么。