Как добавить метод с параметром в список - PullRequest
0 голосов
/ 05 июня 2019

У меня есть общие делегаты.

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();
    }
}

Я использую в методе в форме 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();   
        }
    }

I 'я ищу лучший способ написать универсальный метод для обновления элементов управления в моей форме.

Ответы [ 2 ]

2 голосов
/ 05 июня 2019

Вы можете создать список 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 голос
/ 05 июня 2019

Вы можете сделать это, создав List<Action> и добавив вызовы различных делегатов.

A 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();
...