首页 > 解决方案 > 如何根据用户输入链接方法?

问题描述

我有一种用于处理图像的方法(旋转、过滤、调整大小等)。它看起来像这样:

 public Image ProcessImage(Image image, Func<ImageFactory, ImageFactory> process)
    {
        using (var imageFactory = new ImageFactory(preserveExifData: true))
        {
            using (var imageStream = new MemoryStream())
            {
                var loadResult = imageFactory.Load(image);
                var processResult = process(loadResult);
                processResult.Save(imageStream);
                return Image.FromStream(imageStream);
            }
        }
    }

由于我以这种方式使用 Func<> 我可以像这样调用我想要的编辑方法:

_imageEditor.ProcessImage(_image, im => im.Resize(size))

这意味着我可以链接方法,例如:

_imageEditor.ProcessImage(_image, im => im.Resize(size).Rotate(54).Flip(true))

我的问题是,如何根据使用输入链接这些方法?因此,如果我的用户想要同时旋转和调整大小,我可以添加 .Resize 和 .Rotate 方法(顺便说一下,它们采用不同的参数)。

当然,我可以使用一堆布尔值,但如果我有大量的编辑方法,那将变得不可能,使用起来非常非常难看。

有没有办法向这个链中添加方法,如果有,你会怎么做?

标签: c#delegatesfuncimageprocessor

解决方案


将方法链接在一起的最简单方法是使用AggregateLINQ 方法。

您只需要将您的方法签名更改为Image ProcessImage(Image image, params Func<ImageFactory, ImageFactory>[] processes),然后您可以执行以下操作:

public Image ProcessImage(Image image, params Func<ImageFactory, ImageFactory>[] processes)
{
    using (var imageFactory = new ImageFactory(preserveExifData: true))
    {
        using (var imageStream = new MemoryStream())
        {
            var loadResult = imageFactory.Load(imageStream);
            var processResult = processes.Aggregate(loadResult, (r, p) => p(r));
            processResult.Save(imageStream);
            return Image.FromStream(imageStream);
        }
    }
}

现在您只需Func<ImageFactory, ImageFactory>[] processes从用户的选择中构建您的。


推荐阅读