如何在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
相关产品推荐
相关产品推荐

