特性Attribute
特性是用于运行时传递程序中的各种元素(比如类,方法,结构,枚举,组件等)的行为信息的声明性标签,可以使用特性向程序添加声明性信息,用来修饰各种需要被修饰的目标。我们可以对类、以及C#程序集中的成员进行进一步的描述。
相对于Java端的使用,起着注解的作用,用作数据校验功能时,放在实体类需要校验的字段上
对于需要特殊方法校验的字段,就需要生成一个自定义注解继承父类,然后自定义校验方法,通常有非空校验,字符串长度或这数字长度校验
例:非空校验生成,先生成自定义注解RequireAttribute 继承了基类(对于Java端的父类),
重写自定义的校验方法和反馈的校验信息
public class RequireAttribute : 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);
}
}
已知有实体类
class JcSdmxDTO
{
/**
* ID
*/
public int? id{get;set;}
/**
* 住宿情况
*/
[Require]
public string zszt{get;set;}
/**
* 退宿日期
*/
public DateTime? tsrq{get;set;}
/**
* 年份
*/
[Require]
public string year{get;set;}
[Require]
public string gs{get;set;}
/**
* 月份
*/
[Require]
public string month{get;set;}
/**
* 区域
*/
[Require]
public string qy{get;set;}
/**
* 房间号
*/
[Require]
public string fjh{get;set;}
/**
* 上月电表度数
*/
public Double? dbdsShy{get;set;}
/**
* 本月电表度数
*/
public Double? dbdsBy{get;set;}
/**
* 上月冷水度数
*/
public Double? lsdsShy{get;set;}
/**
* 本月冷水度数
*/
public Double? lsdsBy{get;set;}
/**
* 上月热水度数
*/
public Double? rsdsShy{get;set;}
/**
* 本月热水度数
*/
public Double? rsdsBy{get;set;}
}
其中,对需要做校验的字段加上特性[Require]
然后再这个实体类中加入拓展方法
public static class Extension
{
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 (propertyInfo.GetValue(t).Equals(""))
{
propertyInfo.SetValue(t, null);
}
if (!attribute.Validate(propertyInfo.GetValue(t, null)))
{
errorList.Add($"[{propertyInfo.Name}]" + attribute.error);
}
}
}
}
return string.Join(",", errorList);
}
}
由代码可知,校验过程是通过反射获取属性各字段,然后通过获取被定义到自定义特性的字段对应的数据,再对数据做自己的方法校验处理,,以上是做空值NULL的处理或者空字符的处理,如果输入的值为NULL,自定义的校验方法就会返回False
再根据自定义拓展方法中的判定会生成对应字段名的错误信息
public override bool Validate(object value)
{
return !(value == null);
}
最后如果返回的校验信息通过判定是否非空值,得到校验数据的结果信息,再抛出对应的异常和信息
if (errorStr.Contains(field))
{
errorStr= cap + "数据不能为空";
}
以导入excel为例 ,住宿情况zszt不可为空