博主喝口茶,一毛也是爱

收缩

C# 使用特性验证实体对象属性

6628 人阅读
分类:

验证结果实体对象

/// <summary>
/// 验证属性返回实体
/// </summary>
public class BaseAttributeDto
{
    /// <summary>
    /// true:验证成功
    /// false:验证失败
    /// </summary>
    public bool Result { get; set; }
    /// <summary>
    /// 验证失败错误信息
    /// </summary>
    public string ErrorMsg { get; set; }
}

属性验证抽象类

/// <summary>
/// 属性验证抽象类
/// </summary>
public abstract class AbstractCusAttribute : Attribute
{
    /// <summary>
    /// 验证失败信息
    /// </summary>
    public string ErrorMsg { get; set; }
    /// <summary>
    /// 验证方法
    /// </summary>
    /// <param name="oValue"></param>
    /// <returns></returns>
    public abstract BaseAttributeDto Validate(object oValue);
}

验证属性长度特性

/// <summary>
/// 验证属性长度
/// </summary>
public class CusLengthAttribute : AbstractCusAttribute
{
    public int Min { get; set; }
    public int Max { get; set; }

    /// <summary>
    /// 验证是否为空
    /// </summary>
    /// <param name="oValue"></param>
    /// <returns></returns>
    public override BaseAttributeDto Validate(object oValue)
    {
        var result = new BaseAttributeDto();
        int oValueLen = oValue == null ? 0 : oValue.ToString().Length;
        result.Result = (oValueLen >= Min && oValueLen <= Max);
        if (!result.Result)
        {
            result.ErrorMsg = base.ErrorMsg;
        }

        return result;
    }
}

验证属性是否必填特性

/// <summary>
/// 验证属性是否必填
/// </summary>
public class CusRequiredAttribute : AbstractCusAttribute
{
    /// <summary>
    /// 验证是否为空
    /// </summary>
    /// <param name="oValue"></param>
    /// <returns></returns>
    public override BaseAttributeDto Validate(object oValue)
    {
        var result = new BaseAttributeDto();
        result.Result = oValue != null
            && !string.IsNullOrWhiteSpace(oValue.ToString());
        if (!result.Result)
        {
            result.ErrorMsg = base.ErrorMsg;
        }

        return result;
    }
}

实体属性验证

public static class ModelPropertyAttribute
{
    public static BaseAttributeDto Validate<T>(this T dto)
    {
        var result = new BaseAttributeDto();

        Type type = dto.GetType();
        //获取属性信息
        PropertyInfo[] properties = type.GetProperties();
        foreach (var prop in properties)
        {
            //检查属性是否含有指定特性
            if (prop.IsDefined(typeof(AbstractCusAttribute), true))
            {
                //获取属性值
                object oValue = prop.GetValue(dto);
                //获取属性上的自定义特性
                AbstractCusAttribute remarkAttribute = (AbstractCusAttribute)prop.GetCustomAttribute(typeof(AbstractCusAttribute));

                result = remarkAttribute.Validate(oValue);
                //存在验证失败的直接退出循环
                                if (!result.Status)
                                {
                                    break;
                                }
            }
        }

        return result;
    }
}

开始使用特性

public class People
{
    [CusRequired(ErrorMsg = "请输入名称")]
    public string Name { get; set; }
    [CusLength(Min = 2, Max = 10, ErrorMsg = "用户编号长度为2到10")]
    public string UserNo { get; set; }
}

static void Main(string[] args)
{
    People people = new People()
    {
        Name = "13",
        UserNo = ""
    };
    var result = people.Validate();

    if (!result.Result)
    {
        //验证失败信息
            var msg = result.ErrorMsg;
            return;
    }
    //验证成功,继续自己业务逻辑

    Console.WriteLine("");
    Console.ReadKey();
}

如果验证信息非常多,使用特性可以使代码非常简单,共用性非常强。



和博主交个朋友吧
    发布篇幅
    • 文章总数:0
    • 原创:0
    • 转载:0
    • 译文:0
    文章分类
      文章存档
      阅读排行