这两天在网上看了.net高级课程,学到特性Attribute时,整得晕头转向,花了一天多时间才把思路理清楚,因此也觉得有必要做一次学习总结。
一、在做项目的时侯,所有特性验证类,一定要将其放入一个工具类库,并建一个专门的文件夹来区分。其
二、最好建一个抽象的特性类,每一种验证写一个类继承此抽象类,实现其提供验证的抽象方法。
三、实现特性验证的步骤。
1.建一个静态类,写一个静态的方法,对字段属性进行验证,返回验证结果。这个类可以展开写,实现错误字段次数,错误字段具体异常。
namespace Chinasc.Libraries.AttributeExtend
{
public static class AttributeHelper
{
public static string GetColumnName(this PropertyInfo prop)
{
if (prop.IsDefined(typeof(ColumnAttribute), true))
{
ColumnAttribute attribute=(ColumnAttribute)prop.GetCustomAttribute(typeof(ColumnAttribute),true);
return attribute.GetColumnName();
}
else
{
return prop.Name;
}
}
//验证方法
public static int Validate<T>(this T tModel,ref List<string> ex) where T : BaseModel
{
int cnt = 0; //统计异常结果次数
Type type = tModel.GetType();//获取当前实例类
foreach(var prop in type.GetProperties())//获取实例中所有属性
{
//判断这个属性是否拥有特性
if (prop.IsDefined(typeof(AbstractValidateAttribute), true))
{
object[] attributeArray= prop.GetCustomAttributes(typeof(AbstractValidateAttribute), true);//检索指定成员的指定特性,可能有多个特性,所有用数组
foreach(AbstractValidateAttribute attribute in attributeArray)//遍历特性
{
//对属性进行验证,返回布尔值
bool bl = attribute.Validate(prop.GetValue(tModel));
if (!bl)
{
//将所有异常结果写入List中
ex.Add($"{prop.Name}的值{prop.GetValue(tModel)}发生异常,请检查...");
cnt++;//异常次数加1
}
}
}
}
return cnt;
}
}
}
2.建一个抽象的验证类,类中抽象一个验证方法。再根据验证的需要该建多少种验证方法就建多少个验证类。(这些最好用一个文件夹集中管理)
namespace Chinasc.Libraries.AttributeExtend
{
/// <summary>
/// 数据验 证特性基类,抽象类,提供了一个抽象方法
/// </summary>
[AttributeUsage(AttributeTargets.All, AllowMultiple = true)]
public abstract class AbstractValidateAttribute:Attribute
{
public abstract bool Validate(object value);
}
}
3.这里上一个邮箱验证的类,备注都写的很详细
namespace Chinasc.Libraries.AttributeExtend.Validate
{
/// <summary>
/// 数据验证特性基类
/// AttributeUsage指定特性类的用法,AttributeTargets指定可以对它们应用特性的元素。
/// </summary>
[AttributeUsage(AttributeTargets.All)]
public class EmailAttribute : AbstractValidateAttribute
{
public override bool Validate(object value)
{
if (value==null)
{
return false;
}else
{
//验证Email格式。
return Regex.IsMatch(value.ToString(), @"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$");
}
}
}
}
4.特性类的引用方法,将验证类做为特性添加到方法或者字段上面。就可以使用,例如:
public class Student:BaseModel
{
public string name { get; set; }
public int? age { get; set; }
[EmailAttribute]//引用邮箱格式验证特性
public string email { get; set; }
[Mobile]//引用手手格式验证特性
public string mobile { get; set; }
}