【发布时间】: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等,还是我在代码生成中遗漏了什么?
谢谢。
【问题讨论】:
标签: c# functional-programming language-ext