我有通用代表。
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();
}
}
我正在寻找编写通用方法来更新表单上控件的最佳方法。
答案 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();