[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]
public abstract class BaseAttribute : Attribute
{
public virtual string error { get; set; }
public abstract bool Validate(object value);
}/// <summary>
/// 约束符合正则表达式
/// </summary>
public class RegexAttribute : BaseAttribute
{
public string regexText;
public override string error
{
get
{
if (base.error != null)
{
return base.error;
}
return "属性值不能为空";
}
set => base.error = value;
}
public override bool Validate(object value)
{
var regex = new Regex(regexText);
if (value == null)
{
return false;
}
return regex.Match(value.ToString()).Success;
}
}/// <summary>
/// 约束属性不能为空
/// </summary>
public class RequiredAttribute : BaseAttribute
{
public override string error
{
get
{
if (base.error != null)
{
return base.error;
}
return "属性不能为空";
}
set => base.error = value;
}
public override bool Validate(object value)
{
return !(value == null);
}
}/// <summary>
/// 约束字符串的长度范围
/// </summary>
public class StringRangeAttribute : BaseAttribute
{
public int min { get; set; }
public int max { get; set; }
public override string error
{
get
{
if (base.error != null)
{
return base.error;
}
return $"字符串长度范围{this.min}-{this.max}";
}
set => base.error = value;
}
public override bool Validate(object value)
{
return value?.ToString().Length >= this.min && value.ToString().Length <= this.max;
}
}public static class ValidateFun
{
public static string Validate<T>(this T t)
{
Type type = t.GetType();
//获取所有属性
PropertyInfo[] propertyInfos = type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
List<string> errorList = new List<string>();
foreach (PropertyInfo propertyInfo in propertyInfos)
{
if (propertyInfo.IsDefined(typeof(BaseAttribute)))//如果属性上有定义该属性,此步没有构造出实例
{
foreach (BaseAttribute attribute in propertyInfo.GetCustomAttributes(typeof(BaseAttribute)))
{
if (!attribute.Validate(propertyInfo.GetValue(t, null)))
{
errorList.Add($"[{propertyInfo.Name}]" + attribute.error);
}
}
}
}
return string.Join(",", errorList);
}
} public class Student
{
[Required(error = "id 不能为空!")]
public int? id { get; set; }
[Regex(regexText = "^a.*a$", error = "属性不合格规则")]
[StringRange(min = 5, max = 10)]
public string name { get; set; }
}校验调用
class Program
{
static void Main(string[] args)
{
Student student = new Student()
{
id = null,
name = "ajga555555xba"
};
string errorStr = student.Validate();
if (string.IsNullOrEmpty(errorStr))
{
Console.WriteLine("校验成功");
}
else
{
// 输出结果 [id]id 不能为空!,[name]字符串长度范围5-10
Console.WriteLine(errorStr);
}
Console.ReadKey();
}
}本文来自 www.luofenming.com