如何传递一组代表来运行方法

时间:2011-04-03 19:54:17

标签: c# .net

参考下面的示例,有没有办法将GetType1s()和GetType2s()完成的工作传递给此构造函数?我正在寻找列表<Action>的内容,这样我就可以在构造函数中迭代地运行每个动作而不关心它的作用,但我想不出一个合适的方法来做到这一点其中设置了变量(以及不同类型的变量)。我意识到这与DI和IOC非常接近,所以如果我想将这项工作传递到这样的课程中,也许没有办法创建容器?

      public MainPageViewModel(string taskBaseLocation)
    {
        TasksBaseLocation = taskBaseLocation;
        Type1List = TasksModel.GetType1s(TasksBaseLocation);
        Type2List = TasksModel.GetType2s(TasksBaseLocation);
    }

3 个答案:

答案 0 :(得分:2)

声明一个合适的委托类型并将其传递给通用列表。

public delegate retType MyDelegate(param1type param1, param2type param2,...)

List<MyDelegate> listToPass = new List<MyDelegate>();

答案 1 :(得分:2)

由于代表是多播的,只需传递Action

if(action != null) { action(); } 

并在来电者处结合。

如果您需要独立运行它们(例如,即使先前的操作失败也要运行以后的操作),请解构它:

if(action != null)
{
    foreach(Action child in action.GetInvocationList())
    {
        try
        {
            child();
        }
        catch (Exception ex)
        {
             // handle/log etc
        }
    }
}

但是,请注意,除非委托的上下文已经可以访问字段(以及对新实例的引用,否则这不会神奇地提供对委托中成员变量的访问权限)通过Action<T>代替Action

答案 2 :(得分:0)

我有两种方法,使用纯lambda或使用Delegate.Combine。我更喜欢lambda品种。

using System;
using System.Linq;

namespace X
{
    public class MyType
    {
        public delegate void DoInitialize(MyType instance);
        public int a,b,c;

        public MyType(DoInitialize initialize) 
        {
            initialize(this);
        }

        public MyType(params Action<MyType>[] initializers) 
        {
            foreach (var initializer in initializers)
                initializer(this);
        }

        public static void LambdaApproach()
        {
            var instance = new MyType(
                    i => i.a = 1,
                    i => i.b = 2,
                    i => i.c = 42);
            Console.WriteLine("{0}, {1}, {2}", instance.a, instance.b, instance.c);
        }

        public static void MulticastApproach()
        {
            var lambdas = new DoInitialize[] {
                    i => i.a = 1,
                    i => i.b = 2,
                    i => i.c = 42, };

            var instance = new MyType((DoInitialize) Delegate.Combine(lambdas.ToArray()));
            Console.WriteLine("{0}, {1}, {2}", instance.a, instance.b, instance.c);
        }

        public static void Main(string[] args)
        {
            LambdaApproach();
            MulticastApproach();
        }
    }

}