使用动作列表创建对象

时间:2013-09-18 11:55:25

标签: c# delegates func

目前我正在使用action将一些方法调用附加为字符串。如下所示:

var MyAction = new List<Action>();

MyAction.Add(() => this.FunctionA(new string[] { "All" }));
MyAction.Add(() => this.FunctionB(new string[] {"All"}));
MyAction.Add(() => this.FunctionC(new string[] {"-null-"}));

并迭代此操作以执行一些运行时处理:

foreach (var action in LoadDSAction)
{
    action();
}

但是现在我必须使用相同的方法调用一些对象创建语句。 e.g:

ClssA objA = new ClsA();
ClssB objB = new ClsB();
ClssC objC = new ClsC();

如何将这些添加到动作中以便我可以进一步迭代?

2 个答案:

答案 0 :(得分:0)

如果我有了你的意图,而不是Action,你需要使用返回一些数据的委托。例如。 Func<object>

var factories = new List<Func<object>>();
factories.Add(() => new ClsA());
factories.Add(() => new ClsB());
factories.Add(() => new ClsC());

然后你可以在循环中创建对象:

foreach(var factory in factories)
{
   var obj = factory();
   //
}

如果ClsA,ClsB,ClsC继承了某种基类型,则可以将该类型用作Func泛型类型参数。

答案 1 :(得分:0)

不完全确定你想要达到的目标,但同样的模式肯定会起作用,即

public class ClssA{
    private string id;
    public ClssA(string id)
{
    this.id = id;
    System.Console.WriteLine("I'm {0}", id);
}

然后

MyAction.Add(() => new ClssA("One"));
MyAction.Add(() => new ClssA("Two"));
MyAction.Add(() => new ClssA("Three"));

foreach (var action in MyAction)
{
    action();
}

将实例化您的类,如构造函数的输出所示:

I'm One
I'm Two
I'm Three