前言


在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 Weave 命令整理

    Docker Weave 命令整理 # 查看weave状态 weave status # 查看状态详情 weave status connections # 查看weave相互之间节点建立的关系 we ...

  2. Python IO内核交互了解

    注:Unix \ Linux 环境下的network IO   用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系 ...

  3. [C++ Primer Plus] 第7章、函数(二)课后习题

    一.复习题 6.为什么不对基本数据类型的函数参数使用const? 8.编写一个函数,将字符串中所有c1替换成c2,并返回替换次数. #include<iostream> using nam ...

  4. 基于token的身份验证JWT

    传统身份验证的方法 HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用.这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证一下 ...

  5. Learning-Python【2】:简单介绍Python基本数据类型及程序交互

    人类可以很容易的分清数字与字符的区别,但是计算机并不能,计算机虽然很强大,但在某些方面很笨,你得明确的告诉它,“1”是数字,“我”是文字.否则计算机是分不清的.因此,在每个编程语言中都会有数据类型的概 ...

  6. JS对象、数据类型区别、函数

    对象 基本数据类型都是单一的值,值和值之间没有任何联系,变量之间独立,不能成为一个整体. 对象属于一种符合的数据类型,对象中可以保存对个不同数据类型的属性. 对象分类:  1.内建对象   由ES标准 ...

  7. 【转载】Selenium WebDriver的简单操作说明

    转载自:http://blog.csdn.net/xiao190128/article/details/49784121 1.打开一个测试浏览器 对浏览器进行操作首先需要打开一个浏览器,接下来才能对浏 ...

  8. Zabbix4.0+第三方报警平台OneAlert监控报警

    1. 前言 告警将重要信息发送给运维「或者其他相关人」,及时发现并且处理问题.在所有开源监控软件里面,Zabbix 的告警方式无疑是最棒的.告警的方式各式各样,从 Email 告警到飞信.139/18 ...

  9. C#实现基于ffmpeg加虹软的人脸识别

    关于人脸识别 目前的人脸识别已经相对成熟,有各种收费免费的商业方案和开源方案,其中OpenCV很早就支持了人脸识别,在我选择人脸 识别开发库时,也横向对比了三种库,包括在线识别的百度.开源的OpenC ...

  10. 根据框架的dtd或xsd生成xml文件

    下载Schema文件 首先要下载框架官网下的xsd或者xml文件,例如Spring官网地址,schema里面的就是xsd文件 Myeclipse中配置 我用的Myeclipse纯净版6.5,Windo ...