Как я могу проверить этот атрибут (анонация)? - PullRequest
0 голосов
/ 06 июля 2010

Я новичок в атрибутах.Я просто пробую это на своем консольном приложении.

Так как же я могу проверить мой личный экземпляр ниже примера?

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

    }

Ответы [ 3 ]

3 голосов
/ 06 июля 2010

Вот простой пример кода без отражения.

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;
    }
}
3 голосов
/ 06 июля 2010

Единственная функция, которую может обрабатывать Атрибут, это описать, предоставить некоторые описательные данные члену. Они чисто пассивны и не могут содержать никакой логики. (Существует несколько платформ AOP, которые могут сделать атрибуты активными). Поэтому, если вам нужна логика, вы должны создать другой класс, который будет читать атрибуты, используя MemberInfo.GetCustomAttributes, а также выполнять проверку и возвращать результаты.

0 голосов
/ 06 июля 2010

Ниже код показывает, как определить валидацию только для свойств и дать валидацию идеи для методов, классов и т. Д.

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);
    }
...