using System; 
 | 
using System.Collections.Generic; 
 | 
using System.Linq; 
 | 
using System.Reflection; 
 | 
using System.Text; 
 | 
using System.Threading.Tasks; 
 | 
using WIDESEAWCS_Core.Attributes; 
 | 
  
 | 
namespace WIDESEAWCS_Core.Utilities 
 | 
{ 
 | 
    public class ModelValidate 
 | 
    { 
 | 
        /// <summary> 
 | 
        /// 验证实体参数 
 | 
        /// </summary> 
 | 
        /// <typeparam name="T"></typeparam> 
 | 
        /// <param name="data"></param> 
 | 
        /// <returns></returns> 
 | 
        public static (bool, string, object?) ValidateModelData<T>(T data) where T : class, new() 
 | 
        { 
 | 
            Type modelType = typeof(T); 
 | 
            if (data == null) return (false, "传入参数不可为null", data); 
 | 
            ModelValidateAttribute? modelAttribute = modelType.GetCustomAttribute<ModelValidateAttribute>(); 
 | 
            if (modelAttribute == null) return (false, $"{modelType.Name}未定义【ModelValidateAttribute】特性", data); 
 | 
            PropertyInfo[] propertyInfos = modelType.GetProperties(); 
 | 
            return SimpleValidate(propertyInfos, data); 
 | 
        } 
 | 
  
 | 
        public static (bool, string, object?) ValidateModelData<T>(List<T> datas) where T : class, new() 
 | 
        { 
 | 
            Type modelType = typeof(T); 
 | 
            if (datas == null) return (false, "传入参数不可为null", datas); 
 | 
            if (datas.Count == 0) return (false, "集合个数不可等于0", datas); 
 | 
            foreach (T data in datas) 
 | 
            { 
 | 
                if (data == null) return (false, "传入参数不可为null", data); 
 | 
                ModelValidateAttribute? modelAttribute = modelType.GetCustomAttribute<ModelValidateAttribute>(); 
 | 
                if (modelAttribute == null) return (false, $"{modelType.Name}未定义【ModelValidateAttribute】特性", data); 
 | 
                PropertyInfo[] propertyInfos = modelType.GetProperties(); 
 | 
                (bool, string, object?) result = SimpleValidate(propertyInfos, data); 
 | 
                if (!result.Item1) return result; 
 | 
            } 
 | 
  
 | 
            return (true, $"成功", datas); 
 | 
        } 
 | 
  
 | 
        //private static (bool, string, object?) CustomMethodValidate<T>(ModelValidateAttribute modelAttribute, T data) where T : class, new() 
 | 
        //{ 
 | 
        //    try 
 | 
        //    { 
 | 
        //        if (modelAttribute.CustomValidateMethodTypeName == null) return (false, $"自定义验证方法需要提供方法所在类的类型对象", data); 
 | 
        //        if (modelAttribute.CustomValidateMethodName == null) return (false, $"自定义验证方法需要提供方法名", data); 
 | 
  
 | 
        //        string path = Path.Combine(AppContext.BaseDirectory, $"{modelAttribute.CustomValidateAssemblyName}.dll"); 
 | 
        //        Assembly assembly = Assembly.LoadFrom(path); 
 | 
  
 | 
        //        Type t = assembly.GetType(modelAttribute.CustomValidateAssemblyName + "." + modelAttribute.CustomValidateMethodTypeName); 
 | 
        //        object bbb = App.GetService(t); 
 | 
        //        MethodInfo? methodInfo = t.GetMethod(modelAttribute.CustomValidateMethodName); 
 | 
        //        var result = methodInfo.Invoke(bbb, new object[] { data }); 
 | 
        //        //MethodInfo? methodInfo = modelAttribute.CustomValidateMethodType.GetMethod(modelAttribute.CustomValidateMethodName); 
 | 
        //        //if (methodInfo == null) return (false, $"未在该类型对象【{modelAttribute.CustomValidateMethodType.Name}】中找到该方法【{modelAttribute.CustomValidateMethodName}】", data); 
 | 
        //        //methodInfo.GetGenericArguments() 
 | 
        //        return (true, "成功", data); 
 | 
        //    } 
 | 
        //    catch(Exception ex) 
 | 
        //    { 
 | 
        //        throw new Exception(); 
 | 
        //    } 
 | 
  
 | 
        //} 
 | 
  
 | 
        private static (bool, string, object?) SimpleValidate<T>(PropertyInfo[] propertyInfos, T data) where T : class, new() 
 | 
        { 
 | 
            try 
 | 
            { 
 | 
                foreach (PropertyInfo propertyInfo in propertyInfos) 
 | 
                { 
 | 
                    PropertyValidateAttribute? propertyAttribute = propertyInfo.GetCustomAttribute<PropertyValidateAttribute>(); 
 | 
                    if (propertyAttribute == null) continue; 
 | 
  
 | 
                    object? value = propertyInfo.GetValue(data, null); 
 | 
                    if (propertyAttribute.NotNullAndEmpty) 
 | 
                    { 
 | 
                        if (value == null) return (false, $"{(string.IsNullOrEmpty(propertyAttribute.Description) ? propertyInfo.Name : propertyAttribute.Description)}不可为null", data); 
 | 
                        if (string.IsNullOrEmpty(value.ToString())) return (false, $"{(string.IsNullOrEmpty(propertyAttribute.Description) ? propertyInfo.Name : propertyAttribute.Description)}不可为空字符串", data); 
 | 
                    } 
 | 
  
 | 
                    if (propertyAttribute.MinValue > int.MinValue) 
 | 
                    { 
 | 
                        if (value == null) return (false, $"{(string.IsNullOrEmpty(propertyAttribute.Description) ? propertyInfo.Name : propertyAttribute.Description)}不可为null", data); 
 | 
                        if (propertyAttribute.IsContainMinValue) 
 | 
                        { 
 | 
                            if (Convert.ToInt32(value.ToString()) < propertyAttribute.MinValue) return (false, $"{(string.IsNullOrEmpty(propertyAttribute.Description) ? propertyInfo.Name : propertyAttribute.Description)}的值【{value}】不可小于【{propertyAttribute.MinValue}】", data); 
 | 
                        } 
 | 
                        else 
 | 
                        { 
 | 
                            if (Convert.ToInt32(value.ToString()) <= propertyAttribute.MinValue) return (false, $"{(string.IsNullOrEmpty(propertyAttribute.Description) ? propertyInfo.Name : propertyAttribute.Description)}的值【{value}】要大于【{propertyAttribute.MinValue}】", data); 
 | 
                        } 
 | 
                    } 
 | 
  
 | 
                    if (propertyAttribute.MaxValue < int.MaxValue) 
 | 
                    { 
 | 
                        if (value == null) return (false, $"{(string.IsNullOrEmpty(propertyAttribute.Description) ? propertyInfo.Name : propertyAttribute.Description)}不可为null", data); 
 | 
                        if (propertyAttribute.IsContainMaxValue) 
 | 
                        { 
 | 
                            if (Convert.ToInt32(value.ToString()) >= propertyAttribute.MaxValue) return (false, $"{(string.IsNullOrEmpty(propertyAttribute.Description) ? propertyInfo.Name : propertyAttribute.Description)}的值【{value}】不可大于【{propertyAttribute.MaxValue}】", data); 
 | 
                        } 
 | 
                        else 
 | 
                        { 
 | 
                            if (Convert.ToInt32(value.ToString()) > propertyAttribute.MaxValue) return (false, $"{(string.IsNullOrEmpty(propertyAttribute.Description) ? propertyInfo.Name : propertyAttribute.Description)}的值【{value}】要小于【{propertyAttribute.MaxValue}】", data); 
 | 
                        } 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
            catch (Exception ex) 
 | 
            { 
 | 
                return (false, $"数据验证异常,异常信息:{ex.Message}", data); 
 | 
            } 
 | 
            return (true, "验证成功", data); 
 | 
        } 
 | 
    } 
 | 
} 
 |