using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CloudBuilder.Core.Extensions
{
///
/// 用于参数检查的扩展方法
///
public static class ParameterCheckExtensions
{
///
/// 验证指定值的断言是否为真,如果不为真,抛出指定消息的指定类型异常
///
/// 异常类型
/// 要验证的断言。
/// 异常消息。
private static void Require(bool assertion, string message) where TException : Exception
{
if (assertion)
{
return;
}
if (string.IsNullOrEmpty(message))
{
throw new ArgumentNullException("message");
}
TException exception = (TException)Activator.CreateInstance(typeof(TException), message);
throw exception;
}
///
/// 验证指定值的断言表达式是否为真,不为值抛出异常
///
///
/// 要验证的断言表达式
/// 异常消息
public static void Required(this T value, Func assertionFunc, string message)
{
if (assertionFunc == null)
{
throw new ArgumentNullException("assertionFunc");
}
Require(assertionFunc(value), message);
}
///
/// 验证指定值的断言表达式是否为真,不为真抛出异常
///
/// 要判断的值的类型
/// 抛出的异常类型
/// 要判断的值
/// 要验证的断言表达式
/// 异常消息
public static void Required(this T value, Func assertionFunc, string message) where TException : Exception
{
if (assertionFunc == null)
{
throw new ArgumentNullException("assertionFunc");
}
Require(assertionFunc(value), message);
}
///
/// 检查参数不能为空引用,否则抛出异常。
///
///
/// 参数名称
///
public static void CheckNotNull(this T value, string paramName) where T : class
{
Require(value != null, string.Format("参数“{0}”不能为空引用。", paramName));
}
///
/// 检查字符串不能为空引用或空字符串,否则抛出异常或异常。
///
///
/// 参数名称。
///
///
public static void CheckNotNullOrEmpty(this string value, string paramName)
{
value.CheckNotNull(paramName);
Require(value.Length > 0, string.Format("参数“{0}”不能为空引用或空字符串。", paramName));
}
///
/// 检查Guid值不能为Guid.Empty,否则抛出异常。
///
///
/// 参数名称。
///
public static void CheckNotEmpty(this Guid value, string paramName)
{
Require(value != Guid.Empty, string.Format("参数“{0}”的值不能为Guid.Empty", paramName));
}
///
/// 检查集合不能为空引用或空集合,否则抛出异常或异常。
///
/// 集合项的类型。
///
/// 参数名称。
///
///
public static void CheckNotNullOrEmpty(this IEnumerable collection, string paramName)
{
collection.CheckNotNull(paramName);
Require(collection.Any(), string.Format("参数“{0}”不能为空引用或空集合。", paramName));
}
///
/// 检查参数必须小于[或可等于,参数canEqual]指定值,否则抛出异常。
///
/// 参数类型。
///
/// 参数名称。
/// 要比较的值。
/// 是否可等于。
///
public static void CheckLessThan(this T value, string paramName, T target, bool canEqual = false) where T : IComparable
{
bool flag = canEqual ? value.CompareTo(target) <= 0 : value.CompareTo(target) < 0;
string format = canEqual ? "参数“{0}”的值必须小于或等于“{1}”。" : "参数“{0}”的值必须小于“{1}”。";
Require(flag, string.Format(format, paramName, target));
}
///
/// 检查参数必须大于[或可等于,参数canEqual]指定值,否则抛出异常。
///
/// 参数类型。
///
/// 参数名称。
/// 要比较的值。
/// 是否可等于。
///
public static void CheckGreaterThan(this T value, string paramName, T target, bool canEqual = false) where T : IComparable
{
bool flag = canEqual ? value.CompareTo(target) >= 0 : value.CompareTo(target) > 0;
string format = canEqual ? "参数“{0}”的值必须大于或等于“{1}”。" : "参数“{0}”的值必须大于“{1}”。";
Require(flag, string.Format(format, paramName, target));
}
///
/// 检查参数必须在指定范围之间,否则抛出异常。
///
/// 参数类型。
///
/// 参数名称。
/// 比较范围的起始值。
/// 比较范围的结束值。
/// 是否可等于起始值
/// 是否可等于结束值
///
public static void CheckBetween(this T value, string paramName, T start, T end, bool startEqual = false, bool endEqual = false)
where T : IComparable
{
bool flag = startEqual ? value.CompareTo(start) >= 0 : value.CompareTo(start) > 0;
string message = startEqual
? string.Format("参数“{0}”的值必须在“{1}”与“{2}”之间。", paramName, start, end)
: string.Format("参数“{0}”的值必须在“{1}”与“{2}”之间,且不能等于“{3}”。", paramName, start, end, start);
Require(flag, message);
flag = endEqual ? value.CompareTo(end) <= 0 : value.CompareTo(end) < 0;
message = endEqual
? string.Format("参数“{0}”的值必须在“{1}”与“{2}”之间。", paramName, start, end)
: string.Format("参数“{0}”的值必须在“{1}”与“{2}”之间,且不能等于“{3}”。", paramName, start, end, end);
Require(flag, message);
}
///
/// 检查指定路径的文件夹必须存在,否则抛出异常。
///
///
/// 参数名称。
///
///
public static void CheckDirectoryExists(this string directory, string paramName = null)
{
CheckNotNull(directory, paramName);
Require(Directory.Exists(directory), string.Format("指定的目录路径“{0}”不存在。", directory));
}
///
/// 检查指定路径的文件必须存在,否则抛出异常。
///
///
/// 参数名称。
/// 当文件路径为null时
/// 当文件路径不存在时
public static void CheckFileExists(this string filename, string paramName = null)
{
CheckNotNull(filename, paramName);
Require(File.Exists(filename), string.Format("指定的文件路径“{0}”不存在。", filename));
}
}
}