概括调用函数和委托

Generalize Invoke function and delegate

如何将这两个 function/delegate 分解为一个通用函数和委托? 有没有简单的方法可以做到这一点?

public TabControl tab;
public Label devlog;

delegate void tabHandlerCallback(bool e);
public void tabHandler(bool e)
{
    if (tab.InvokeRequired)
    {
        tab.Invoke(new tabHandlerCallback(tabHandler), new object[] { e });
    }
    else
    {
        tab.Enabled = e;
    }
}

delegate void devHandlerCallback(string e);
public void devHandler(string e)
{
    if (devlog.InvokeRequired)
    {
        devlog.Invoke(new devHandlerCallback(devHandler), new object[] { e });
    }
    else
    {
        devlog.Text = e;
    }
}
        

您可以制作一个可以 运行 必要代码的函数,直接或通过调用。

private void InvokeIfNecessary(Control control, Action action)
{
    if(control.InvokeRequired)
        control.Invoke(action);
    else
        action();
}

// use it like this
public void devHandler(string e)
{
    InvokeIfNecessary(() => devlog.Text = e);
}

public void tabHandler(bool e)
{
    InvokeIfNecessary(() => tab.Enabled = e);
}

你可以使用下面的代码

public delegate void InvokeDelegate();

//T_Elapsed is a thread and controls required invoke
private void T_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    this.BeginInvoke(new InvokeDelegate(InvokeMethodLabel));
    this.BeginInvoke(new InvokeDelegate(InvokeMethodProgressBar));
}
void InvokeMethodLabel()
{
    myLabel.Text = "Test Label";
}
void InvokeMethodProgressBar()
{
    progressBar.Value = (int)(progressBar.Value * 2);
}

我是这样做的:

delegate void controlHandlerCallback(object control, object param, string field = "Text");
public void controlHandler(object control, object param, string field="Text")
{
    if (((Control)control).InvokeRequired)
    {
        ((Control)control).Invoke(new controlHandlerCallback(controlHandler), new object[] { control, param,field });
    }
    else
    {
        PropertyInfo propertyInfo = control.GetType().GetProperty(field);
        propertyInfo?.SetValue(control, param);
    } 
}