CloudBuilder/CloudBuilder.Core/Extensions/ParameterCheckExtensions.cs
owenchen 1c0c83af5f ow
2026-05-12 10:09:31 +08:00

201 lines
10 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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