我是关于属性的新手。我只是在我的控制台应用程序上尝试它。
那我怎样才能在下面的例子中验证我的人物实例?
class Person
{
[StringLength(8,ErrorMessage="Please less then 8 character")]
public string Name { get; set; }
}
答案 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);
}