系统要求方法都返回 Result 结果,通常我们会如此定义一个 Result

 1     public class Result<T>
2 {
3 public virtual int Code { get; set; }
4
5 public virtual T Data { get; set; }
6
7 public virtual string Message { get; set; }
8 }
9
10 public class Result : Result<object>
11 {
12 // 快速创建成功结果
13 public static Result<T> Success<T>(T data)
14 {
15 return new Result<T>() { Data = data };
16 }
17
18 // 快速创建失败结果
19 public static Result<T> Fail<T>(int code, string message)
20 {
21 return new Result<T>() { Code = code, Message = message };
22 }
23 }

  得益于C#强大的类型推断,我们可以非常简单的返回成功或失败结果

 1     public Result<User> GetUser(int userId)
2 {
3 User user = null; // Read from database
4 if (user == null)
5 {
6 return Result.Fail<User>(400, "用户不存在");
7 }
8 else
9 {
10 return Result.Success(user);
11 }
12 }

  成功的时候,Success() 方法可以自动推断出Data为 User 类;

  但是失败的时候,必须手动的指明Data为 User 类,虽然仅仅多敲了几个字母,但我还是想简化,因为失败时,Data根本不需要赋值,也不在乎Data 的类型。

  C# 可以使用 Implicit 自定义隐式转换,可以将 Result 自动隐式转换转换为 Result<T>,考虑到我们只需要在失败的时候才转换,所以我定义了一个  FailResult

 1     public class FailResult : Result
2 {
3 }
4
5 public class Result : Result<object>
6 {
7 // 新增加的方法
8 public static FailResult Fail(int code, string message)
9 {
10 return new FailResult() { Code = code, Message = message };
11 }
12 }

  这样的话,不论时成功还是失败,我们都不需要指定Data 的类型了

 1     public Result<User> GetUser(int userId)
2 {
3 User user = null; // Read from database
4 if (user == null)
5 {
6 return Result.Fail(400, "用户不存在"); // 不用指明 <User> 了
7 }
8 else
9 {
10 return Result.Success(user);
11 }
12 }

  心细的朋友会发现,这种 Result.Fail 其实是先 new 一个 FailResult,然后编译器再 new 一个 Result<T>, 事实上多创建了一个无用的实例,但我觉得对于CLR而言这种开销可以忽略不记。

  

  下面是完整的代码:

 1 using System;
2
3 namespace ConsoleApp1
4 {
5 class Program
6 {
7 static void Main(string[] args)
8 {
9 Console.WriteLine("Hello World!");
10 }
11
12 public Result<User> GetUser(int userId)
13 {
14 User user = null; // Read from database
15 if (user == null)
16 {
17 return Result.Fail(400, "用户不存在"); // 不用指明 <User> 了
18 //return Result.Fail<User>(400, "用户不存在");
19 }
20 else
21 {
22 return Result.Success(user);
23 }
24 }
25 }
26
27 public class Result<T>
28 {
29 public virtual int Code { get; set; }
30
31 public virtual T Data { get; set; }
32
33 public virtual string Message { get; set; }
34
35
36 public static implicit operator Result<T>(FailResult failResult)
37 {
38 return new Result<T>() { Code = failResult.Code, Message = failResult.Message };
39 }
40 }
41
42 public class Result : Result<object>
43 {
44 public static Result<T> Success<T>(T data)
45 {
46 return new Result<T>() { Data = data };
47 }
48
49 public static Result<T> Fail<T>(int code, string message)
50 {
51 return new Result<T>() { Code = code, Message = message };
52 }
53
54 public static FailResult Fail(int code, string message)
55 {
56 return new FailResult() { Code = code, Message = message };
57 }
58 }
59
60 public class FailResult : Result
61 {
62 }
63
64 public class User
65 {
66 }
67 }

最新文章

  1. 使用、支持、帮助Moon.Orm
  2. ctags使用细节
  3. Android 友盟分享躺过的几个坑,大坑,坑爹啊
  4. Spring day01笔记
  5. Unable to execute dex: Multiple dex files define Lcom/kenai/jbosh/AbstractAttr
  6. js利用数组length属性清空和截短数组
  7. web前端面试题收集(一)
  8. 往xml中更新节点
  9. AfxBeginThread和AfxEndThread+内存泄露
  10. c#序列化反序列化工具(json,binary,xml)
  11. openNebula images
  12. ECSHOP常用函数
  13. 使用ToggleButton和StackPanel+Border实现圆角开关按钮动画效果
  14. echarts、higncharts折线图或柱状图显示数据为0的点
  15. Lucene 06 - 使用Lucene的Query API查询数据
  16. TCP连接之报文首部
  17. js正则、js全选、反选、全不选、ajax批删
  18. 前端html的简单认识
  19. [AaronYang原创] 敏捷开发-Jira 6.0.5环境搭建[2]
  20. 大型运输行业实战_day07_2_数据字典实现

热门文章

  1. vscode远程调试c++
  2. 菜鸟学git的基本命令及常见错误
  3. 开发工具-PowerShell下载地址
  4. 【Srping】事务的执行原理(一)
  5. 记一次APP渗透登录验证绕过思路
  6. 关于个人全栈项目【臻美Chat】遇到的BUG以及解决方法
  7. NC13328 倒水
  8. 事务@Transactional注解的属性
  9. 研发效能生态完整图谱&amp;DevOps工具选型必看
  10. java geteway 手机返回数据