You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于LanguageExt.Core Result<T>使用困惑:求示例或更优Result模式包推荐

针对LanguageExt.Result的优化用法与替代方案

一、优化LanguageExt.Result的使用体验

如果你觉得LanguageExt的Result灵活性不足,可以通过模式匹配或扩展方法解决守卫和异常获取的问题:

1. 用模式匹配实现便捷守卫

LanguageExt的Result本质是 discriminated union,可直接用C#模式匹配做条件守卫:

using LanguageExt;
using static LanguageExt.Prelude;

// 定义返回带异常的Result方法
public Result<int, Exception> Divide(int numerator, int denominator)
{
    try
    {
        return Success(numerator / denominator);
    }
    catch (Exception ex)
    {
        return Failure<int, Exception>(ex);
    }
}

// 模式匹配做守卫
var divisionResult = Divide(10, 0);

if (divisionResult is Success<int, Exception> success)
{
    Console.WriteLine($"计算结果:{success.Value}");
}
else if (divisionResult is Failure<int, Exception> failure)
{
    // 直接获取异常信息
    Console.WriteLine($"错误:{failure.Error.Message}");
    Console.WriteLine($"异常堆栈:{failure.Error.StackTrace}");
}

2. 扩展方法简化守卫与异常获取

如果频繁使用,可以封装扩展方法减少重复代码:

public static class ResultExtensions
{
    // 判断是否成功
    public static bool IsSuccess<T, TErr>(this Result<T, TErr> result) 
        => result.IsSuccess;

    // 判断是否失败
    public static bool IsFailure<T, TErr>(this Result<T, TErr> result) 
        => result.IsFailure;

    // 获取失败时的错误/异常
    public static TErr? GetError<T, TErr>(this Result<T, TErr> result) 
        => result.IsFailure ? ((Failure<T, TErr>)result).Error : default;
}

// 使用扩展方法
var result = Divide(10, 2);
if (result.IsSuccess())
{
    // 处理成功逻辑
}
else
{
    var ex = result.GetError<int, Exception>();
    if (ex != null)
    {
        Console.WriteLine($"捕获异常:{ex.Message}");
    }
}

二、推荐更灵活的Result模式替代包

如果LanguageExt的Result仍无法满足需求,以下两个包更适合日常场景:

1. ErrorOr

轻量级、零依赖,原生支持C#模式匹配,可直接作为返回值,内置错误分类,方便携带异常信息:

using ErrorOr;

public ErrorOr<int> Divide(int numerator, int denominator)
{
    if (denominator == 0)
        return Error.Validation("Denominator cannot be zero");
    
    try
    {
        return numerator / denominator;
    }
    catch (Exception ex)
    {
        // 将异常附加到错误元数据中
        return Error.Failure(ex.Message).WithMetadata("Exception", ex);
    }
}

// 使用示例
var result = Divide(10, 0);
if (result.IsError)
{
    var error = result.FirstError;
    // 提取异常信息
    if (error.Metadata.TryGetValue("Exception", out var exObj) && exObj is Exception ex)
    {
        Console.WriteLine($"异常详情:{ex.Message}");
    }
}
else
{
    Console.WriteLine($"结果:{result.Value}");
}

2. OneOf

基于 discriminated union 的强类型解决方案,支持多个成功/失败类型,灵活性极高,适合复杂业务场景:

using OneOf;

// 定义成功和失败类型
public record DivideSuccess(int Value);
public record DivideError(Exception Exception);

// 返回OneOf类型
public OneOf<DivideSuccess, DivideError> Divide(int numerator, int denominator)
{
    try
    {
        return new DivideSuccess(numerator / denominator);
    }
    catch (Exception ex)
    {
        return new DivideError(ex);
    }
}

// 使用模式匹配守卫
var result = Divide(10, 0);
if (result.TryPickT0(out var success, out var error))
{
    Console.WriteLine($"结果:{success.Value}");
}
else
{
    Console.WriteLine($"异常:{error.Exception.Message}");
}

// 或用Switch处理分支
result.Switch(
    success => Console.WriteLine($"成功:{success.Value}"),
    error => Console.WriteLine($"失败:{error.Exception.Message}")
);

内容的提问来源于stack exchange,提问作者Ove Stoerholt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 08:25:04