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

如何在C#中强制通过指定方法创建Record类型实例

限制Success/Failure实例仅通过Result静态方法创建的实现方案

要实现Success<TResult>和Failure<TError>实例只能通过Result的静态方法创建,核心是封闭这两个类型的构造访问权限,仅允许Result内部的方法调用构造函数。以下是具体实现方案:

调整代码结构

将Success和Failure改为Result的私有嵌套类型,同时在基类中添加抽象属性方便外部处理结果:

namespace WebApi.Utils
{
    public struct Roid { }

    public abstract record Result<TResult, TError>
    {
        // 对外暴露的状态与结果属性
        public abstract bool IsSuccess { get; }
        public abstract TResult? SuccessValue { get; }
        public abstract TError? ErrorValue { get; }

        // 私有嵌套成功类型,仅Result内部可访问
        private record Success<T>(T Value) : Result<T, Roid>
        {
            public override bool IsSuccess => true;
            public override T? SuccessValue => Value;
            public override Roid? ErrorValue => default;
        }

        // 私有嵌套失败类型,仅Result内部可访问
        private record Failure<T>(T Error) : Result<Roid, T>
        {
            public override bool IsSuccess => false;
            public override Roid? SuccessValue => default;
            public override T? ErrorValue => Error;
        }

        // 对外唯一的实例创建入口
        public static Result<T, Roid> Success<T>(T result) => new Success<T>(result);
        public static Result<Roid, T> Failed<T>(T error) => new Failure<T>(error);
    }
}

约束原理

  • Success和Failure作为Result的私有嵌套类型,外部代码无法直接访问它们的构造函数,彻底杜绝了new Success<T>(...)或new Failure<T>(...)的可能性。
  • 所有实例创建必须通过Result.Success(...)和Result.Failed(...)静态方法完成,完全符合需求。

外部使用示例

外部代码通过基类Result<TResult, TError>接收实例,并通过抽象属性处理结果:

// 创建成功结果
var successResult = Result<int, string>.Success(200);
// 创建失败结果
var failureResult = Result<int, string>.Failed("请求参数非法");

// 通过属性判断并处理
if (successResult.IsSuccess)
{
    Console.WriteLine($"操作成功:{successResult.SuccessValue}");
}
else
{
    Console.WriteLine($"操作失败:{successResult.ErrorValue}");
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 05:35:16