Я начал использовать шаблон обобщенного типа результата c в качестве объекта-оболочки, который включает возвращаемое значение и информацию об операции, например, успешно ли она завершилась. Вот пример:
public class Researcher
{
public Result<string> LearnThing(bool factDesired)
{
// Validate and bail if failure
var validationResult = ValidateIntentions(factDesired);
if (!validationResult.Succeeded)
{
// Ideally: return validationResult directly without converting to new instance
return Result.Failure<string>(validationResult.Error);
}
return StateOpinion();
}
public Result<string> StateOpinion()
{
return Result.Success("I like turtles");
}
public Result<bool> ValidateIntentions(bool factDesired)
{
if (factDesired)
{
// Ideally: no <bool> required, infer default instead
return Result.Failure<bool>("Only opinions here, sorry");
}
else
{
return Result.Success(true);
}
}
}
public class Result<T>
{
public bool Succeeded { get; set; }
public string Error { get; set; }
public T Value { get; set; }
}
// Static helpers
public static class Result
{
public static Result<T> Success<T>(T value)
{
return new Result<T> { Succeeded = true, Value = value };
}
public static Result<T> Failure<T>(string error)
{
return new Result<T> { Succeeded = false, Error = error };
}
}
Здесь общий c Result<T>
класс используется для каждого метода, а вспомогательный класс stati c предоставляет механизм для создания результатов с предполагаемым статусом успеха. Пока что это работает нормально.
Единственное, что меня раздражает при таком подходе, это то, что мне нужно часто повторять <T>
там, где в идеале это могло бы быть предположено или когда меня больше не волнует T Value
(что было бы default
) и всего около Error
, как в случае сбоев. Я отчасти понимаю, что C# не следует из типов, возвращаемых методом, но я встречал некоторые упоминания неявных операторов , которые, кажется, позволяют некоторые крутые трюки , которых я не могу вполне понимаю.
Итак, я смиренно задаю вопрос C# волшебникам из вас: есть ли какие-то вариации или c я могу добавить к этому подходу, чтобы добиться большего вывода типов и, по сути, неявного Result<"I don't care">
для результатов отказа?