dotnet返回2种类型中的1种

时间:2018-11-24 23:27:26

标签: c# .net

我有一个简单的方法设置来创建一个条目,如果成功,则返回创建的条目。如果不是,则返回ValidationError。

public async Task<MyNewEntry> CreateEntry(MyUser user, MyEntryRequest entry)

如果输入有效,这很好用。但是,如果验证失败,我想返回ValidationError。

我尝试这样做:

public async Task<MyNewEntry | ValidationError> CreateEntry(MyUser user, MyEntryRequest entry)

但是它无法编译。如何构造此方法,使其能够返回MyNewEntryValidationError

1 个答案:

答案 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)