如何验证此属性(注释)?

时间:2010-07-05 21:01:11

标签: c# validation attributes annotations

我是关于属性的新手。我只是在我的控制台应用程序上尝试它。

那我怎样才能在下面的例子中验证我的人物实例?

class Person
    {
        [StringLength(8,ErrorMessage="Please less then 8 character")]
        public string Name { get; set; }

    }

3 个答案:

答案 0 :(得分:3)

属性可以处理的唯一功能是描述,向成员提供一些描述性数据。它们纯粹是被动的,不能包含任何逻辑。 (有一些AOP框架可以使属性处于活动状态)。因此,如果您需要逻辑,则必须创建另一个使用MemberInfo.GetCustomAttributes读取属性的类,然后执行验证并返回结果。

答案 1 :(得分:3)

这是一个没有反射的简单代码示例。

class Program
{
    static void Main(string[] args)
    { 
        var invalidPerson = new Person { Name = "Very long name" };
        var validPerson = new Person { Name = "1" };

        var validator = new Validator<Person>();

        Console.WriteLine(validator.Validate(validPerson).Count);
        Console.WriteLine(validator.Validate(invalidPerson).Count);

        Console.ReadLine();
    }
}

public class Person
{
    [StringLength(8, ErrorMessage = "Please less then 8 character")]
    public string Name { get; set; }
}

public class Validator<T> 
{
    public IList<ValidationResult> Validate(T entity)
    {
        var validationResults = new List<ValidationResult>();
        var validationContext = new ValidationContext(entity, null, null);
        Validator.TryValidateObject(entity, validationContext, validationResults, true);
        return validationResults;
    }
}

答案 2 :(得分:0)

下面的代码显示了如何仅确定属性的验证,并为方法,类等提供构思验证。

public class DataValidator
    {
        public class ErrorInfo
        {
            public ErrorInfo(string property, string message)
            {
                this.Property = property;
                this.Message = message;
            }

            public string Message;
            public string Property;
        }

        public static IEnumerable<ErrorInfo> Validate(object instance)
        {
            return from prop in instance.GetType().GetProperties()
                   from attribute in prop.GetCustomAttributes(typeof(ValidationAttribute), true).OfType<ValidationAttribute>()
                   where !attribute.IsValid(prop.GetValue(instance, null))
                   select new ErrorInfo(prop.Name, attribute.FormatErrorMessage(string.Empty));
        }
    }

将此代码添加到项目后,我们可以使用它:

    var errors =DataValidator.Validate(person);

    foreach (var item in errors)
    {
        Console.WriteLine(item.Property +" " + item.Message);
    }