Result<T>
Result pattern for explicit error handling without exceptions.
Properties
| Property | Type | Description |
|---|---|---|
| IsSuccess | bool | Operation succeeded |
| IsFailure | bool | Operation failed |
| Data | T? | Success value |
| ErrorMessage | string? | Primary error message |
| Errors | IReadOnlyList<string> | All error messages |
| ErrorCode | string? | Error categorization code |
Factory Methods
| Method | Description |
|---|---|
| Success(T data) | Creates successful result |
| Failure(string message, string? code) | Creates failed result |
| Failure(IEnumerable<string> errors, string? code) | Multiple errors |
| Failure(Result result) | Copy errors from another result |
Instance Methods
| Method | Description |
|---|---|
| Map<TNew>(Func<T, TNew>) | Transform success value |
| OnSuccess(Action<T>) | Execute if successful |
| OnFailure(Action<IReadOnlyList<string>>) | Execute if failed |
| GetValueOrDefault(T?) | Get value or default |
Usage
csharp
public async Task<Result<User>> CreateUserAsync(CreateUserCommand cmd)
{
if (await _repo.EmailExistsAsync(cmd.Email))
return Result<User>.Failure("Email already exists", "EMAIL_EXISTS");
var user = new User(cmd.Email, cmd.Name);
await _repo.AddAsync(user);
return Result<User>.Success(user);
}