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
{
///
/// 验证实体参数
///
///
///
///
public static (bool, string, object?) ValidateModelData(T data) where T : class, new()
{
Type modelType = typeof(T);
if (data == null) return (false, "传入参数不可为null", data);
ModelValidateAttribute? modelAttribute = modelType.GetCustomAttribute();
if (modelAttribute == null) return (false, $"{modelType.Name}未定义【ModelValidateAttribute】特性", data);
PropertyInfo[] propertyInfos = modelType.GetProperties();
return SimpleValidate(propertyInfos, data);
}
public static (bool, string, object?) ValidateModelData(List 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();
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(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(PropertyInfo[] propertyInfos, T data) where T : class, new()
{
try
{
foreach (PropertyInfo propertyInfo in propertyInfos)
{
PropertyValidateAttribute? propertyAttribute = propertyInfo.GetCustomAttribute();
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);
}
}
}