Skip to content

Class Result<T> ​

Namespace: Momentum.Extensions
Assembly: Momentum.Extensions.dll

Represents a result that can be either a success value or a list of validation failures.

csharp
public class Result<T> : OneOfBase<T, List<ValidationFailure>>, IOneOf

Type Parameters ​

T

The type of the success value.

Inheritance ​

object ← OneOfBase<T, List<ValidationFailure>> ← Result<T>

Implements ​

IOneOf

Inherited Members ​

OneOfBase<T, List<ValidationFailure>>.Switch(Action<T>, Action<List<ValidationFailure>>), OneOfBase<T, List<ValidationFailure>>.Match<TResult>(Func<T, TResult>, Func<List<ValidationFailure>, TResult>), OneOfBase<T, List<ValidationFailure>>.TryPickT0(out T, out List<ValidationFailure>), OneOfBase<T, List<ValidationFailure>>.TryPickT1(out List<ValidationFailure>, out T), OneOfBase<T, List<ValidationFailure>>.Equals(object), OneOfBase<T, List<ValidationFailure>>.ToString(), OneOfBase<T, List<ValidationFailure>>.GetHashCode(), OneOfBase<T, List<ValidationFailure>>.Value, OneOfBase<T, List<ValidationFailure>>.Index, OneOfBase<T, List<ValidationFailure>>.IsT0, OneOfBase<T, List<ValidationFailure>>.IsT1, OneOfBase<T, List<ValidationFailure>>.AsT0, OneOfBase<T, List<ValidationFailure>>.AsT1, object.GetType(), object.MemberwiseClone(), object.ToString(), object.Equals(object?), object.Equals(object?, object?), object.ReferenceEquals(object?, object?), object.GetHashCode()

Examples ​

public Result<User> CreateUser(CreateUserCommand command)
{
    var validationResult = validator.Validate(command);
    if (!validationResult.IsValid)
        return validationResult.Errors;

    var user = new User(command.Name, command.Email);
    return user;
}

Remarks ​

Result Pattern Implementation ​

Overview ​

This class uses the OneOf library to provide a discriminated union pattern, allowing methods to return either a successful result of type T or a list of validation failures. This is particularly useful for command handlers and other operations that need to communicate validation errors without throwing exceptions.

The Result pattern provides a functional approach to error handling, making it explicit whether an operation succeeded or failed. This eliminates the need for exception-based error handling in business logic scenarios where failures are expected and recoverable.

Key Benefits ​

  • Explicit Error Handling: Forces callers to handle both success and failure cases
  • Performance: Avoids the overhead of exceptions for expected validation failures
  • Type Safety: Compile-time guarantees about handling both success and error paths
  • Functional Programming: Enables functional composition and chaining of operations
  • Clean Architecture: Separates business rule violations from unexpected system errors

Common Usage Patterns ​

Command Handler Implementation ​

csharp
public class CreateUserCommandHandler
{
    public Result<User> Handle(CreateUserCommand command)
    {
        var validationResult = validator.Validate(command);
        if (!validationResult.IsValid)
            return validationResult.Errors;

        var user = new User(command.Name, command.Email);
        return user;
    }
}

Consuming Results ​

csharp
var result = handler.Handle(command);

result.Match(
    user => Console.WriteLine($"Created user: {user.Name}"),
    errors => errors.ForEach(e => Console.WriteLine($"Error: {e.ErrorMessage}"))
);

API Controller Integration ​

csharp
[HttpPost]
public ActionResult<UserDto> CreateUser(CreateUserRequest request)
{
    var result = userService.CreateUser(request);

    return result.Match<ActionResult<UserDto>>(
        user => Ok(mapper.Map<UserDto>(user)),
        errors => BadRequest(errors.Select(e => e.ErrorMessage))
    );
}

Constructors ​

Result(OneOf<T, List<ValidationFailure>>) ​

csharp
public Result(OneOf<T, List<ValidationFailure>> _)

Parameters ​

_ OneOf<T, List<ValidationFailure>>

Operators ​

explicit operator T(Result<T>) ​

csharp
public static explicit operator T(Result<T> _)

Parameters ​

_ Result<T>

Returns ​

T

explicit operator List<ValidationFailure>(Result<T>) ​

csharp
public static explicit operator List<ValidationFailure>(Result<T> _)

Parameters ​

_ Result<T>

Returns ​

List<ValidationFailure>

implicit operator Result<T>(T) ​

csharp
public static implicit operator Result<T>(T _)

Parameters ​

_ T

Returns ​

Result<T>

implicit operator Result<T>(List<ValidationFailure>) ​

csharp
public static implicit operator Result<T>(List<ValidationFailure> _)

Parameters ​

_ List<ValidationFailure>

Returns ​

Result<T>