前言


在Visual Studio 中的NuGet管理器中可以下载安装,也可以直接在NuGet控制台输入下面的指令安装:

Install-Package HslCommunication

NuGet安装教程  http://www.cnblogs.com/dathlin/p/7705014.html

联系作者及加群方式(激活码在群里发放):http://www.hslcommunication.cn/Cooperation

概述


通常我们执行一个方法的时候,方法会实现一堆复杂的功能,我们需要知道是否操作成功,如果操作失败,失败结果又是什么,失败代号又是什么。

除了上面的场景外,我们可能还会返回一个自己需要的结果值,比如一个额外的string对象,Bitmap对象,甚至是自定义的对象,使用本工具的类可以轻松实现,提供了从1一个自定义对象到10个自定义对象的派生类,以满足您日常的绝大多使用情况。

举例


此处定义了一个方法,传入文件路径,输出文件内容,事实上这个方法是很容易出现异常的,由于文件不存在,文件被占用,文件路径太长等等,如下的方法就可以相对优雅的读取内容:

        /// <summary>
/// 输入一个文件名,输出文件名的内容
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
private HslCommunication.OperateResult<string> GetInformation(string fileName)
{
HslCommunication.OperateResult<string> result = new HslCommunication.OperateResult<string>(); try
{
using (System.IO.StreamReader sr = new System.IO.StreamReader(fileName, Encoding.UTF8))
{
result.Content = sr.ReadToEnd();
result.IsSuccess = true;
}
}
catch(Exception ex)
{
result.Message = ex.Message;
} return result;
}

至于调用它,也是非常的方便:

        private void userButton10_Click(object sender, EventArgs e)
{
HslCommunication.OperateResult<string> result = GetInformation("D:\\123.txt");
if(result.IsSuccess)
{
MessageBox.Show(result.Content);
}
else
{
MessageBox.Show("读取失败:" + result.Message);
}
}

下面就贴出这个类及派生类的源代码,方便大家使用及学习:

    /// <summary>
/// 操作结果的类,只带有成功标志和错误信息
/// </summary>
public class OperateResult
{
/// <summary>
/// 指示本次访问是否成功
/// </summary>
public bool IsSuccess { get; set; } /// <summary>
/// 具体的错误描述
/// </summary>
public string Message { get; set; } = StringResources.UnknownError; /// <summary>
/// 具体的错误代码
/// </summary>
public int ErrorCode { get; set; } = 10000; /// <summary>
/// 允许用户自己使用的一个额外的int数据,可以根据自身的需求进行扩充
/// </summary>
public int CustomerCode { get; set; } = 0; /// <summary>
/// 消息附带的额外信息
/// </summary>
public object Tag { get; set; } /// <summary>
/// 获取错误代号及文本描述
/// </summary>
/// <returns></returns>
public string ToMessageShowString()
{
return $"{StringResources.ErrorCode}:{ErrorCode}{Environment.NewLine}{StringResources.TextDescription}:{Message}";
} } /// <summary>
/// 操作结果的泛型类,允许带一个用户自定义的泛型对象,推荐使用这个类
/// </summary>
/// <typeparam name="T">泛型类</typeparam>
public class OperateResult<T> : OperateResult
{
/// <summary>
/// 用户自定义的泛型数据
/// </summary>
public T Content { get; set; }
} /// <summary>
/// 操作结果的泛型类,允许带两个用户自定义的泛型对象,推荐使用这个类
/// </summary>
/// <typeparam name="T1">泛型类</typeparam>
/// <typeparam name="T2">泛型类</typeparam>
public class OperateResult<T1, T2> : OperateResult
{
/// <summary>
/// 用户自定义的泛型数据1
/// </summary>
public T1 Content1 { get; set; } /// <summary>
/// 用户自定义的泛型数据2
/// </summary>
public T2 Content2 { get; set; }
} /// <summary>
/// 操作结果的泛型类,允许带三个用户自定义的泛型对象,推荐使用这个类
/// </summary>
/// <typeparam name="T1">泛型类</typeparam>
/// <typeparam name="T2">泛型类</typeparam>
/// <typeparam name="T3">泛型类</typeparam>
public class OperateResult<T1, T2, T3> : OperateResult
{
/// <summary>
/// 用户自定义的泛型数据1
/// </summary>
public T1 Content1 { get; set; } /// <summary>
/// 用户自定义的泛型数据2
/// </summary>
public T2 Content2 { get; set; } /// <summary>
/// 用户自定义的泛型数据3
/// </summary>
public T3 Content3 { get; set; }
} /// <summary>
/// 操作结果的泛型类,允许带四个用户自定义的泛型对象,推荐使用这个类
/// </summary>
/// <typeparam name="T1">泛型类</typeparam>
/// <typeparam name="T2">泛型类</typeparam>
/// <typeparam name="T3">泛型类</typeparam>
/// <typeparam name="T4">泛型类</typeparam>
public class OperateResult<T1, T2, T3, T4> : OperateResult
{
/// <summary>
/// 用户自定义的泛型数据1
/// </summary>
public T1 Content1 { get; set; } /// <summary>
/// 用户自定义的泛型数据2
/// </summary>
public T2 Content2 { get; set; } /// <summary>
/// 用户自定义的泛型数据3
/// </summary>
public T3 Content3 { get; set; } /// <summary>
/// 用户自定义的泛型数据4
/// </summary>
public T4 Content4 { get; set; }
} /// <summary>
/// 操作结果的泛型类,允许带五个用户自定义的泛型对象,推荐使用这个类
/// </summary>
/// <typeparam name="T1">泛型类</typeparam>
/// <typeparam name="T2">泛型类</typeparam>
/// <typeparam name="T3">泛型类</typeparam>
/// <typeparam name="T4">泛型类</typeparam>
/// <typeparam name="T5">泛型类</typeparam>
public class OperateResult<T1, T2, T3, T4, T5> : OperateResult
{
/// <summary>
/// 用户自定义的泛型数据1
/// </summary>
public T1 Content1 { get; set; } /// <summary>
/// 用户自定义的泛型数据2
/// </summary>
public T2 Content2 { get; set; } /// <summary>
/// 用户自定义的泛型数据3
/// </summary>
public T3 Content3 { get; set; } /// <summary>
/// 用户自定义的泛型数据4
/// </summary>
public T4 Content4 { get; set; } /// <summary>
/// 用户自定义的泛型数据5
/// </summary>
public T5 Content5 { get; set; } } /// <summary>
/// 操作结果的泛型类,允许带六个用户自定义的泛型对象,推荐使用这个类
/// </summary>
/// <typeparam name="T1">泛型类</typeparam>
/// <typeparam name="T2">泛型类</typeparam>
/// <typeparam name="T3">泛型类</typeparam>
/// <typeparam name="T4">泛型类</typeparam>
/// <typeparam name="T5">泛型类</typeparam>
/// <typeparam name="T6">泛型类</typeparam>
public class OperateResult<T1, T2, T3, T4, T5, T6> : OperateResult
{
/// <summary>
/// 用户自定义的泛型数据1
/// </summary>
public T1 Content1 { get; set; } /// <summary>
/// 用户自定义的泛型数据2
/// </summary>
public T2 Content2 { get; set; } /// <summary>
/// 用户自定义的泛型数据3
/// </summary>
public T3 Content3 { get; set; } /// <summary>
/// 用户自定义的泛型数据4
/// </summary>
public T4 Content4 { get; set; } /// <summary>
/// 用户自定义的泛型数据5
/// </summary>
public T5 Content5 { get; set; } /// <summary>
/// 用户自定义的泛型数据5
/// </summary>
public T6 Content6 { get; set; } } /// <summary>
/// 操作结果的泛型类,允许带七个用户自定义的泛型对象,推荐使用这个类
/// </summary>
/// <typeparam name="T1">泛型类</typeparam>
/// <typeparam name="T2">泛型类</typeparam>
/// <typeparam name="T3">泛型类</typeparam>
/// <typeparam name="T4">泛型类</typeparam>
/// <typeparam name="T5">泛型类</typeparam>
/// <typeparam name="T6">泛型类</typeparam>
/// <typeparam name="T7">泛型类</typeparam>
public class OperateResult<T1, T2, T3, T4, T5, T6, T7> : OperateResult
{
/// <summary>
/// 用户自定义的泛型数据1
/// </summary>
public T1 Content1 { get; set; } /// <summary>
/// 用户自定义的泛型数据2
/// </summary>
public T2 Content2 { get; set; } /// <summary>
/// 用户自定义的泛型数据3
/// </summary>
public T3 Content3 { get; set; } /// <summary>
/// 用户自定义的泛型数据4
/// </summary>
public T4 Content4 { get; set; } /// <summary>
/// 用户自定义的泛型数据5
/// </summary>
public T5 Content5 { get; set; } /// <summary>
/// 用户自定义的泛型数据6
/// </summary>
public T6 Content6 { get; set; } /// <summary>
/// 用户自定义的泛型数据7
/// </summary>
public T7 Content7 { get; set; } } /// <summary>
/// 操作结果的泛型类,允许带八个用户自定义的泛型对象,推荐使用这个类
/// </summary>
/// <typeparam name="T1">泛型类</typeparam>
/// <typeparam name="T2">泛型类</typeparam>
/// <typeparam name="T3">泛型类</typeparam>
/// <typeparam name="T4">泛型类</typeparam>
/// <typeparam name="T5">泛型类</typeparam>
/// <typeparam name="T6">泛型类</typeparam>
/// <typeparam name="T7">泛型类</typeparam>
/// <typeparam name="T8">泛型类</typeparam>
public class OperateResult<T1, T2, T3, T4, T5, T6, T7, T8> : OperateResult
{
/// <summary>
/// 用户自定义的泛型数据1
/// </summary>
public T1 Content1 { get; set; } /// <summary>
/// 用户自定义的泛型数据2
/// </summary>
public T2 Content2 { get; set; } /// <summary>
/// 用户自定义的泛型数据3
/// </summary>
public T3 Content3 { get; set; } /// <summary>
/// 用户自定义的泛型数据4
/// </summary>
public T4 Content4 { get; set; } /// <summary>
/// 用户自定义的泛型数据5
/// </summary>
public T5 Content5 { get; set; } /// <summary>
/// 用户自定义的泛型数据6
/// </summary>
public T6 Content6 { get; set; } /// <summary>
/// 用户自定义的泛型数据7
/// </summary>
public T7 Content7 { get; set; } /// <summary>
/// 用户自定义的泛型数据8
/// </summary>
public T8 Content8 { get; set; }
} /// <summary>
/// 操作结果的泛型类,允许带九个用户自定义的泛型对象,推荐使用这个类
/// </summary>
/// <typeparam name="T1">泛型类</typeparam>
/// <typeparam name="T2">泛型类</typeparam>
/// <typeparam name="T3">泛型类</typeparam>
/// <typeparam name="T4">泛型类</typeparam>
/// <typeparam name="T5">泛型类</typeparam>
/// <typeparam name="T6">泛型类</typeparam>
/// <typeparam name="T7">泛型类</typeparam>
/// <typeparam name="T8">泛型类</typeparam>
/// <typeparam name="T9">泛型类</typeparam>
public class OperateResult<T1, T2, T3, T4, T5, T6, T7, T8, T9> : OperateResult
{
/// <summary>
/// 用户自定义的泛型数据1
/// </summary>
public T1 Content1 { get; set; } /// <summary>
/// 用户自定义的泛型数据2
/// </summary>
public T2 Content2 { get; set; } /// <summary>
/// 用户自定义的泛型数据3
/// </summary>
public T3 Content3 { get; set; } /// <summary>
/// 用户自定义的泛型数据4
/// </summary>
public T4 Content4 { get; set; } /// <summary>
/// 用户自定义的泛型数据5
/// </summary>
public T5 Content5 { get; set; } /// <summary>
/// 用户自定义的泛型数据6
/// </summary>
public T6 Content6 { get; set; } /// <summary>
/// 用户自定义的泛型数据7
/// </summary>
public T7 Content7 { get; set; } /// <summary>
/// 用户自定义的泛型数据8
/// </summary>
public T8 Content8 { get; set; } /// <summary>
/// 用户自定义的泛型数据9
/// </summary>
public T9 Content9 { get; set; }
} /// <summary>
/// 操作结果的泛型类,允许带十个用户自定义的泛型对象,推荐使用这个类
/// </summary>
/// <typeparam name="T1">泛型类</typeparam>
/// <typeparam name="T2">泛型类</typeparam>
/// <typeparam name="T3">泛型类</typeparam>
/// <typeparam name="T4">泛型类</typeparam>
/// <typeparam name="T5">泛型类</typeparam>
/// <typeparam name="T6">泛型类</typeparam>
/// <typeparam name="T7">泛型类</typeparam>
/// <typeparam name="T8">泛型类</typeparam>
/// <typeparam name="T9">泛型类</typeparam>
/// <typeparam name="T10">泛型类</typeparam>
public class OperateResult<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> : OperateResult
{
/// <summary>
/// 用户自定义的泛型数据1
/// </summary>
public T1 Content1 { get; set; } /// <summary>
/// 用户自定义的泛型数据2
/// </summary>
public T2 Content2 { get; set; } /// <summary>
/// 用户自定义的泛型数据3
/// </summary>
public T3 Content3 { get; set; } /// <summary>
/// 用户自定义的泛型数据4
/// </summary>
public T4 Content4 { get; set; } /// <summary>
/// 用户自定义的泛型数据5
/// </summary>
public T5 Content5 { get; set; } /// <summary>
/// 用户自定义的泛型数据6
/// </summary>
public T6 Content6 { get; set; } /// <summary>
/// 用户自定义的泛型数据7
/// </summary>
public T7 Content7 { get; set; } /// <summary>
/// 用户自定义的泛型数据8
/// </summary>
public T8 Content8 { get; set; } /// <summary>
/// 用户自定义的泛型数据9
/// </summary>
public T9 Content9 { get; set; } /// <summary>
/// 用户自定义的泛型数据10
/// </summary>
public T10 Content10 { get; set; }
}

OperateResult 基础类及派生类介绍的更多相关文章

  1. 第三十七章、PyQt输入部件:QAbstractSlider派生类QScrollBar滚动条、QSlider滑动条、QDial刻度盘功能介绍

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.引言 Designer中的输入部件Horizo ...

  2. 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)

    [源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...

  3. C++学习17派生类的构造函数

    基类的构造函数不能被继承,在声明派生类时,对继承过来的成员变量的初始化工作也要由派生类的构造函数来完成.所以在设计派生类的构造函数时,不仅要考虑派生类新增的成员变量,还要考虑基类的成员变量,要让它们都 ...

  4. C++:调整基类成员在派生类中的访问属性的其他方法(同名成员和访问声明)

    4.3 调整基类成员在派生类中的访问属性的其他方法 4.3.1 同名函数 在定义派生类的时候,C++语言允许在派生类中说明的成员与基类中的成员名字相同,也就是 说,派生类可以重新说明与基类成员同名的成 ...

  5. C++:派生类的构造函数和析构函数

    4.2 派生类的构造函数和析构函数4.2.1 派生类构造函数和析构函数的执行顺序 通常情况下,当创建派生类对象时,首先执行基类的构造函数,随后再执行派生类的构造函数:当撤销派生类对象时,则先执行派生类 ...

  6. c++ 派生类向基类转换的可访问性

    对于c++面向对象一直很疑惑,这次决定下功夫把它弄明白 一.派生类和基类之间的类型转换 首先理解,派生类含有基类的所有成分,只不过有些就算在派生类的成员函数也不能访问而已. (1)派生类和基类的自动转 ...

  7. c++中派生类对基类成员的三种访问规则(转)

    C++中派生类对基类成员的访问形式主要有以下两种:1.内部访问:由派生类中新增成员对基类继承来的成员的访问.2.对象访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问.今天给大家介绍在3中 ...

  8. 【C++继承与派生之二】有子对象的派生类的构造函数

    这是我今天看书刚刚看到的,觉着以前对这一块内容了解不多,所以整理一下分享给大家.首先要介绍一下子对象的概念.类的数据成员不仅可以是int.char这样的基本类型,也可以是类对象,如可以包含这样的数据成 ...

  9. Android Paint类介绍以及浮雕和阴影效果的设置

    Paint类介绍 Paint即画笔,在绘制文本和图形用它来设置图形颜色, 样式等绘制信息. 1.图形绘制 setARGB(int a,int r,int g,int b); 设置绘制的颜色,a代表透明 ...

随机推荐

  1. Docker Swarm redis 集群搭建

    Docker Swarm redis 集群搭建 环境1: 系统:Linux Centos 7.4 x64 内核:Linux docker 3.10.0-693.2.2.el7.x86_64 Docke ...

  2. 使用Angular2的Http发送AJAX请求

    使用Angular2的Http发送AJAX请求 Angular的文档并不详细,甚至API文档也有一些错误.经过查阅资料并经大量实验,终于明确了Angular的Http发送Ajax请求的方式方法.本文描 ...

  3. 绘制COCO数据集结果

    import os import time import datetime import mmcv import cv2 as cv import json import numpy as np im ...

  4. 如何恢复IIS出厂默认设置

    How to restore IIS settings and Default Web Site? http://superuser.com/questions/704850/how-to-resto ...

  5. 剑指offer 04:重构二叉树

    题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...

  6. 【五】jquery之事件(focus事件与blur事件)[提示语的出现及消失时机]

    例题:当鼠标移动到某个文本框时,提示语消失. 当失去焦点时,如果该文本框有内容,保存内容.没有内容,则恢复最初的提示语句 <!DOCTYPE html> <html> < ...

  7. Codeforces 1100 F - Ivan and Burgers

    F - Ivan and Burgers 思路:线性基+贪心,保存线性基中每一位的最后一个 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #p ...

  8. JS中如何判断对象是对象还是数组

    JS中如何判断对象是对象还是数组 一.总结 一句话总结:typeof Array.isArray === "function",Array.isArray(value)和Objec ...

  9. 《HTTP 权威指南》笔记:第十五章 实体与编码

     如果把 「HTTP 报文」想象为因特网货运系统的「箱子」,那么「HTTP 实体」就是报文中的实际的「货物」. 其中,实体又包含了「实体首部」 和 「实体主体」,实体首部用于描述各种参数,实体主体就 ...

  10. 【Mysql】Mysql Json类型或Text类型可以建索引吗?

    一.JSON类型 答案是不可以 为Json类型建索引会报错 mysql)); ERROR (): JSON column 'card_pay_data' cannot be used in key s ...