如何执行带有参数的Action委托列表
本文关键字:Action 列表 参数 何执 行带 | 更新日期: 2023-09-27 18:06:17
如何执行带有参数的Action委托列表
public static void CompareAll(List<Action<object,object>> compareDelegates)
{
List<Exception> exceptions = new List<Exception>();
// The issue is in below line - how to pass parameters to the delegate
compareDelegates.ForEach(del = (a,b) =>
{
try
{
del.Invoke(a,b);
}
catch (Exception ex)
{
exceptions.Add(ex);
}
});
}
并从下面的代码
调用上面的函数List<Action<object, object>> compareDelegates = new List<Action<object, object>>();
compareDelegates.Add((a,b) => Compare(1,2));
CompareAll(compareDelegates);
由于您的委托不会对传递给它们的输入执行任何操作,因此您应该使用空的Action
。将代码改为:
public static void CompareAll(List<Action> compareDelegates)
{
List<Exception> exceptions = new List<Exception>();
compareDelegates.ForEach(del =>
{
try
{
del.Invoke();
}
catch (Exception ex)
{
exceptions.Add(ex);
}
});
}
// somewhere else...
List<Action> compareDelegates = new List<Action>();
compareDelegates.Add(() => Compare(1,2));
CompareAll(compareDelegates);
编辑:既然你的问题令人费解,但在我上面解决的方式中并没有真正的意义,这里有另一个
如果你的意思是有一个Action<object,object>
+ 2值的列表,你应该这样做的Tuple
:
public static void CompareAll(
List<Tuple<Action<Object,Object>,Object,Object>> compareDelegates)
{
List<Exception> exceptions = new List<Exception>();
compareDelegates.ForEach(tup =>
{
try
{
tup.Item1.Invoke(tup.Item2, tup.Item3);
}
catch (Exception ex)
{
exceptions.Add(ex);
}
});
}
// somewhere else...
List<Tuple<Action<Object,Object>,Object,Object>> compareDelegates =
new List<Tuple<Action<Object,Object>,Object,Object>>();
compareDelegates.Add(Tuple.Create((a,b) => Compare(a,b), 1, 2));
CompareAll(compareDelegates);
这一行:
compareDelegates.ForEach(del = (a,b) =>
你的参数很奇怪。在本例中,ForEach
的类型签名是ForEach(Action<Action<object, object>>)
。下面是如何使用它的一个例子。
object parameter1 = 2;
object parameter2 = 3;
compareDelegates.ForEach(a => a(parameter1, parameter2));
调用2
和3
列表中的每个动作。但是,您的示例并不是很清楚这到底是什么意思。