我有一个包含动作的列表,我想将它们链接在一起,应该如何处理?
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));
我建议您可以将每个操作都转换为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。