如何使用参数执行Action委托列表

时间:2015-08-04 21:31:45

标签: c# delegates action

如何使用参数

执行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);

2 个答案:

答案 0 :(得分:0)

由于您的代表对传递的内容不做任何操作,因此您应该使用空的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);

答案 1 :(得分:0)

在这一行:

compareDelegates.ForEach(del = (a,b) =>

你的参数很奇怪。在这种情况下,ForEach的类型签名为ForEach(Action<Action<object, object>>)。以下是如何使用它的示例。

object parameter1 = 2;
object parameter2 = 3;
compareDelegates.ForEach(a => a(parameter1, parameter2));

这会使用23调用列表中的每个操作。但是,你的例子并不十分清楚这是什么意思。