LanguageExt:如何使用 [Union] 执行相当于 Option<T>.Match 的操作?
Posted
技术标签:
【中文标题】LanguageExt:如何使用 [Union] 执行相当于 Option<T>.Match 的操作?【英文标题】:LanguageExt: How do I do the equivalent of Option<T>.Match with a [Union]? 【发布时间】:2021-07-19 23:33:08 【问题描述】:我想创建一个类似于Option<T>
的联合,但它允许 3 向状态,而不是 2 向状态。这样做的原因是在从数据库加载数据时使用它。
如果我用Option<T>
来做这件事,我会做这样的事情......
Option<Person> jimOpt = Option<Person>.None;
Person jimOpt = await _appDbContext.People.FirstOrDefault(p => p.Id == 1);
jimOpt.Match(person =>
Console.WriteLine("Jim was found");
,
() =>
Console.WriteLine("No such Jim");
);
但是,这并不能区分数据仍在加载和找不到人的时间。这意味着在加载数据时,Option
处于None
状态,这在 UI 中给人以错误的印象,因为它看起来(短暂地)好像没有找到数据。
我的想法是创建一个像这样的Union
...
[Union]
public interface Loading<T>
Loading<T> NotLoaded(); // Initial state, data not loaded yet
Loading<T> Loaded(T value); // Data loaded successfully
Loading<T> NotFound(); // Data access complete, but entity not found
...并执行与上述类似的操作,但在数据访问进行时将其设置为NotLoaded<Person>
,然后在数据访问完成时将其设置为Loaded<Person>
或NotFound<Person>
。
问题是生成的Union
在这里似乎没有任何帮助。我认为代码生成的想法是消除大量繁重的工作。
我是否需要自己实现Match
、Map
等,还是我在代码生成中遗漏了什么?
谢谢。
【问题讨论】:
【参考方案1】:Match
现在为Union
类型生成。你也可以使用c#switch
表达式
【讨论】:
感谢 Paul,我想我们前段时间在 GitHub 问题中解决了这个问题。我忘了我在这里问过!以上是关于LanguageExt:如何使用 [Union] 执行相当于 Option<T>.Match 的操作?的主要内容,如果未能解决你的问题,请参考以下文章