c# - 如何根据用户输入链接方法?
问题描述
我有一种用于处理图像的方法(旋转、过滤、调整大小等)。它看起来像这样:
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 方法(顺便说一下,它们采用不同的参数)。
当然,我可以使用一堆布尔值,但如果我有大量的编辑方法,那将变得不可能,使用起来非常非常难看。
有没有办法向这个链中添加方法,如果有,你会怎么做?
解决方案
将方法链接在一起的最简单方法是使用Aggregate
LINQ 方法。
您只需要将您的方法签名更改为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
从用户的选择中构建您的。
推荐阅读
- c - 分配二维数组
- android - Espresso:如何在用户同意的情况下对 Sms Retriever 进行 UI 测试?
- css - 有没有办法使用变换比例使内容自动适应父 div?
- r - 删除空白值而不是 R 中的整个列/行
- azure-devops - Azure DevOps 管道无法在运行时扩展任何环境变量
- apache-camel - 使用 Camel Endpoint DSL 和 @EndpointInject 创建不同的端点
- python - Python Pandas DataFrame:意外取消排序多索引
- c - 如何在c中为if语句提供数组输入?
- javascript - 如何在角度 5 中将 @Input 变量设置为可选?
- java - 在运行 weblogic 服务器的 linux 服务器中将 Act Framework 部署到生产环境