using System.Collections.Generic;
static Repo r = new Repo();
public static void Main()
LogResult(new Foo { Name = "Yay!" });
LogResult(new Foo { Name = "Fail" });
private static void LogResult(Foo foo) {
Console.WriteLine($"Success New Id: {result.Value.Id}");
var errors = string.Join(", ", result.Errors.Select(x => x.Description));
Console.WriteLine($"Fail: {errors}");
public class Repo : IRepo {
private List<Foo> foos = new List<Foo>();
public IOperationResult<Foo> Add(Foo foo) {
if (foo.Name == "Fail") {
return OperationResult.Failed<Foo>("Some business rule failed");
return OperationResult.SucceededWithValue<Foo>(foo);
public IOperationResult<Foo> Add(Foo foo);
public interface IOperationResult
public bool Succeeded { get; }
public IEnumerable<OperationError> Errors { get; }
public interface IOperationResult<out T>: IOperationResult
public class OperationResult: IOperationResult
public bool Succeeded { get; init; }
public IEnumerable<OperationError> Errors { get; init; } = new List<OperationError>();
public static OperationResult Success { get; } = new() { Succeeded = true };
public static OperationResult<T> SucceededWithValue<T>(T value)
public static OperationResult Failed(params OperationError[] errors)
var result = new OperationResult
Errors = errors ?? Array.Empty<OperationError>()
public static OperationResult Failed(IEnumerable<OperationError> errors)
var result = new OperationResult
Errors = errors ?? Array.Empty<OperationError>()
public static OperationResult<T> Failed<T>(params OperationError[] errors)
var result = new OperationResult<T>
Errors = errors ?? Array.Empty<OperationError>()
public static OperationResult<T> Failed<T>(IEnumerable<OperationError> errors)
var result = new OperationResult<T>
Errors = errors ?? Array.Empty<OperationError>()
public class OperationResult<T> : OperationResult, IOperationResult<T>
public T Value { get; init; }
public class OperationError
public OperationError(string description)
Description = description;
public string Description { get; set; }
public static implicit operator OperationError(string description)
public string Name {get;set;}