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)); } } }