如何在列表中链接方法

问题描述 投票:0回答:1

我有一个包含动作的列表,我想将它们链接在一起,应该如何处理?

List<Action> actions = new List<Action>();
_imageEditor.ProcessImage(_image, factory => factory.AllTheMethodsInActions));

这是我在不使用列表的情况下进行的处理:

_imageEditor.ProcessImage(_image, factory => factory.Resize(_currentSize).Rotate(_currentDegrees).Flip(_currentFlipVertically))

这有可能吗?可以改为“添加”方法吗?伪代码

Action original = () => _imageEditor.ProcessImage(_image, factory => factory.Resize(_currentSize));
Action toAdd = () => Rotate(_currentDegrees);
Action newAction = original + toAdd
// Result would look like this //
_imageEditor.ProcessImage(_image, factory => factory.Resize(_currentSize).Rotate(_currentDegrees));
c# delegates action
1个回答
0
投票

我建议您可以将每个操作都转换为Func

那么您可以具有以下格式。考虑到并非每个链接的步骤都返回相同类型的实例,所以这是一个通用版本:

var actions=new List<Func<object,object>>[]{ 
    (input, output)=> { (input as FactoryType).Resize(_currentSize); return input},
    (input, output)=> { (input as FactoryType).Rotate(_currentDegrees); return output}
};

// TODO: Add more steps here individually

_imageEditor.ProcessImage(_image, factory => {
    object input=factory;
    foreach( var action in actions)
    {
        input=action.Invoke(input);
    }
});

foreach循环也可以转换为IEnumerable.Aggregate调用,例如

_imageEditor.ProcessImage(_image, factory => {
    actions.Aggregate<Func<object,object>,object,object>(factory, (input, step)=>{input=step(input)}, input=>input);
    });

如果您确定每一步都会输出与输入类型相同的结果,那么我们可以在操作定义中将类型从对象缩小为自定义的FactoryType。

© www.soinside.com 2019 - 2024. All rights reserved.