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>