You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

148 lines
4.9 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Security.Permissions;
using System.Text;
namespace HslCommunication.BasicFramework
{
/****************************************************************************
*
* 创建日期: 2017年6月25日 15:45:40
* 功能: 一个基础的泛型异常类
* 参考: 参考《CLR Via C#》P413
*
***************************************************************************/
/// <summary>
/// 一个自定义的支持序列化反序列化的异常类具体用法参照第四版《CLR Via C#》P414
/// </summary>
/// <typeparam name="TExceptionArgs">泛型异常</typeparam>
[Serializable]
public sealed class Exception<TExceptionArgs> : Exception, ISerializable where TExceptionArgs : ExceptionArgs
{
/// <summary>
/// 用于反序列化的
/// </summary>
private const string c_args = "Args";
private readonly TExceptionArgs m_args;
/// <summary>
/// 消息
/// </summary>
public TExceptionArgs Args { get { return m_args; } }
/// <summary>
/// 实例化一个异常对象
/// </summary>
/// <param name="message">消息</param>
/// <param name="innerException">内部异常类</param>
public Exception(string message = null, Exception innerException = null) : this(null, message, innerException)
{
}
/// <summary>
/// 实例化一个异常对象
/// </summary>
/// <param name="args">异常消息</param>
/// <param name="message">消息</param>
/// <param name="innerException">内部异常类</param>
public Exception(TExceptionArgs args, string message = null, Exception innerException = null) : base(message, innerException)
{
m_args = args;
}
/******************************************************************************************************
*
* 这个构造器用于反序列化的,由于类是密封的,所以构造器是私有的
* 如果这个构造器不是密封的,这个构造器就应该是受保护的
*
******************************************************************************************************/
[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)]
private Exception(SerializationInfo info, StreamingContext context) : base(info, context)
{
m_args = (TExceptionArgs)info.GetValue(c_args, typeof(TExceptionArgs));
}
/******************************************************************************************************
*
* 这个方法用于序列化由于ISerializable接口的存在这个方法必须是公开的
*
******************************************************************************************************/
/// <summary>
/// 获取存储对象的序列化数据
/// </summary>
/// <param name="info">序列化的信息</param>
/// <param name="context">流的上下文</param>
[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)]
public override void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue(c_args, m_args);
base.GetObjectData(info, context);
}
/// <summary>
/// 获取描述当前异常的消息
/// </summary>
public override string Message
{
get
{
string baseMsg = base.Message;
return m_args == null ? baseMsg : baseMsg + " (" + m_args.Message + ")";
}
}
/// <summary>
/// 确定指定的object是否等于当前的object
/// </summary>
/// <param name="obj">异常对象</param>
/// <returns>是否一致</returns>
public override bool Equals(object obj)
{
Exception<TExceptionArgs> other = obj as Exception<TExceptionArgs>;
if (other == null) return false;
return object.Equals(m_args, other.m_args) && base.Equals(obj);
}
/// <summary>
/// 用作特定类型的哈希函数
/// </summary>
/// <returns>int值</returns>
public override int GetHashCode()
{
return base.GetHashCode();
}
}
/// <summary>
/// 异常消息基类
/// </summary>
[Serializable]
public abstract class ExceptionArgs
{
/// <summary>
/// 获取消息文本
/// </summary>
public virtual string Message
{
get { return string.Empty; }
}
}
}