LanguageExt:如何做相当于 Option<T>.Match with a [Union] 的操作?
LanguageExt: How do I do the equivalent of Option<T>.Match with a [Union]?
我想创建一个行为有点像 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
等,还是我在代码生成中遗漏了什么?
谢谢。
Match
现在为 Union
类型生成。您还可以使用 c# switch
表达式
我想创建一个行为有点像 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
等,还是我在代码生成中遗漏了什么?
谢谢。
Match
现在为 Union
类型生成。您还可以使用 c# switch
表达式