如何在列表中添加带有参数的方法

时间:2019-06-05 19:19:05

标签: c# list delegates

我有通用代表。

public delegate void Metodo();
public delegate void Metodo<T>(T parametro);
public delegate void Metodo<T, U>(T parametro1, U parametro2);
public delegate void Metodo<T, U, V>(T parametro1, U parametro2, V parametro3);
public delegate void Metodo<T, U, V, W>(T parametro1, U parametro2, V parametro3, W parametro4);

还有一个列表:

private List<Metodo> ListOfMethods;

我添加的方法没有这样的参数:

public void Method();
ListOfMethods.Add(Method);

我如何添加列表中带有参数的方法?

就像这是我全班一样。

public class ListOfUpdateMethods
{
    public delegate void Metodo();
    public delegate void Metodo<T>(T parametro);
    public delegate void Metodo<T, U>(T parametro1, U parametro2);
    public delegate void Metodo<T, U, V>(T parametro1, U parametro2, V parametro3);
    public delegate void Metodo<T, U, V, W>(T parametro1, U parametro2, V parametro3, W parametro4);

    private List<Metodo> MetodosPreAtualizacao;
    private List<Metodo> MetodosAtualizacao;

    public ListOfUpdateMethods()
    {
        this.MetodosPreAtualizacao = new List<Metodo>();
        this.MetodosAtualizacao    = new List<Metodo>();
    }

    public void AddMetodosPreAtualizacao(Metodo m)
    {
        this.MetodosPreAtualizacao.Add(m);
    }

    public void AddMetodosAtualizacao(Metodo m)
    {
        this.MetodosAtualizacao.Add(m);
    }

    public void ExecutaMetodosPreAtualizacao()
    {
        foreach (var metodos in this.MetodosPreAtualizacao)
            metodos();
    }

    public void ExecutaMetodosAtualizacao()
    {
        foreach (var metodos in this.MetodosAtualizacao)
            metodos();
    }
}

我在Method中使用Windows窗体:

private void UpdadeControl(ListOfUpdateMethods list, Control control)
    {
        list.ExecutaMetodosPreAtualizacao();

        if (control.InvokeRequired)
        {
            var action = new Action<ListOfUpdateMethods, Control>(UpdadeControl);
            control.Invoke(action, new object[] { list, control });
        }
        else
        {
            list.ExecutaMetodosAtualizacao();   
        }
    }

我正在寻找编写通用方法来更新表单上控件的最佳方法。

2 个答案:

答案 0 :(得分:2)

您可以创建MulticastDelegate的列表。例如:

List<MulticastDelegate> multicastDelegates = new List<MulticastDelegate>();

multicastDelegates.Add(new Action(() => Console.WriteLine("Hello World!")));
multicastDelegates.Add(new Action<int>(x => Console.WriteLine(x)));

foreach (var multicastDelegate in multicastDelegates)
{
    if (multicastDelegate is Action<int> actionInt)
    {
       actionInt(1);
    }
    else if (multicastDelegate is Action action)
    {
       action();
    }
}

答案 1 :(得分:1)

您可以通过创建List<Action>并添加各种代表的调用来做到这一点。

List<Action>可以包含任何类型的动作,而不仅仅是这些代表之一。如果封装了列表,则可以确保仅添加要添加的操作类型。

public class MetodoList
{
    private readonly List<Action> _metodos = new List<Action>();

    public void Add(Metodo metodo)
    {
        _metodos.Add(metodo.Invoke);
    }

    public void Add<T>(Metodo<T> metodo, T argument)
    {
        _metodos.Add(() => metodo.Invoke(argument));
    }

    public void Add<T, U>(Metodo<T, U> metodo, T thing, U uther)
    {
        _metodos.Add(() => metodo.Invoke(thing, uther));
    }

    // more of these.

    public void InvokeAll()
    {
        _metodos.ForEach(m => m.Invoke());
    }
}

虽然我不知道这是干什么的,但这是您的用法:

var metodos = new MetodoList();
var target = new HasMetodos();
metodos.Add(target.DoSomething);
metodos.Add(target.DoSomethingWithTwoArguments, "x", 1);
metodos.InvokeAll();