Дотнет возвращает 1 из 2 типов

2

У меня есть простой метод настройки, чтобы создать запись и, если она прошла успешно, вернуть созданную запись. Если это не так, верните ValidationError.

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

Это прекрасно работает, если запись была действительной. Но я хочу вернуть ValidationError, если проверка не удалась.

Я пытался сделать это:

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

Но тогда это не компилируется. Как мне сконструировать этот метод так, чтобы он мог возвращать либо MyNewEntry либо ValidationError

  • 3
    AFAIK нет ничего встроенного. Вы можете обернуть их в структуру Either (как в Scala ), или, например, обернуть ошибку валидации в исключении, или вернуть один в качестве выходного параметра, а другой - ноль, если установлен, но я не уверен, что какой-либо из них супер чистый.
  • 2
    Возвращать два разных типа, как правило, плохая идея. Вы можете просто установить «допустимый» флаг в своем классе MyNewEntry, который указывает на успех или неудачу.
Показать ещё 6 комментариев
Теги:

1 ответ

5
Лучший ответ

Для этого вы можете использовать Result-Type, который состоит из свойства "bool Success" и Error, а также свойства Entry, значение которого всегда только одно заполняется значением, в зависимости от успеха вашего метода.

public class CreateEntryResult
{
    public bool Success {get;set;}
    public MyNewEntry Entry {get;set;}
    public ValdidationError Error {get;set;}
}

Чтобы сэкономить память (вы можете создать дополнительный объект для каждого результата), вы также можете вернуть структуру. Просто замените ключевое слово "class" в моем коде на "struct". Содержащиеся ссылки затем будут переданы в виде значений, и вам не придется думать о каком-либо влиянии на сборку мусора.

Другим способом сделать это, которого я не видел в последние годы, является шаблон "Try", в котором вы возвращаете тип результата (обычно bool) и используете out-параметры для возврата ваших значений. Я не уверен, как out-параметры работают вместе с async.

bool TryCreateEntry(..., out MyNewEntry entry, out ValidationError error)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню