我有一个简单的方法设置来创建一个条目,如果成功,则返回创建的条目。如果不是,则返回ValidationError。
public async Task<MyNewEntry> CreateEntry(MyUser user, MyEntryRequest entry)
如果输入有效,这很好用。但是,如果验证失败,我想返回ValidationError。
我尝试这样做:
public async Task<MyNewEntry | ValidationError> CreateEntry(MyUser user, MyEntryRequest entry)
但是它无法编译。如何构造此方法,使其能够返回MyNewEntry
或ValidationError
答案 0 :(得分:5)
为此,您可以使用一个Result-Type,它由一个属性“ bool Success”和一个Error以及一个Entry属性组成,根据您的成功程度,其Entry属性始终始终只填充一个值。方法。
public class CreateEntryResult
{
public bool Success {get;set;}
public MyNewEntry Entry {get;set;}
public ValdidationError Error {get;set;}
}
要节省一些内存(您将在每个结果上创建一个附加对象),还可以返回一个struct。只需将我代码中的“ class”关键字替换为“ struct”即可。然后,所包含的引用将作为值传递,您不必考虑对垃圾回收的任何影响。
执行此操作的另一种方法(近年来我还没有见过)是“尝试”模式,您可以在其中返回结果类型(通常是布尔值),并使用输出参数返回值。 我不确定输出参数如何与异步一起使用。
bool TryCreateEntry(..., out MyNewEntry entry, out ValidationError error)