Why Java Sucks and C# Rocks(3):Attribute与Annotation
2010-05-04 00:00:00 来源:WEB开发网于是,我们便可以在一个类的属性上进行标记,表示对某个属性的验证要求:
public class Person
{
[Range(Min = 10, Max = 60)]
public int Age { get; set; }
[Range(Min = 30, Max = 50)]
public int Size { get; set; }
[Regex(Pattern = @"^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$")]
public string Email { get; set; }
}
这样的标记便表示Age的合法范围是10到60,Size的合法范围是30到50,而Email需要满足特定的正则表达式。标记之后,我们便可以使用统一的代码进行验证,例如:
public static void Validate(object o)
{
var type = o.GetType();
foreach (var property in type.GetProperties())
{
var validateAttrs =
(ValidationAttribute[])property.GetCustomAttributes(
typeof(ValidationAttribute), true);
var propValue = property.GetValue(o, null);
foreach (var attr in validateAttrs)
{
var result = attr.Validate(propValue);
// do more things
}
}
}
如此,我们便可以轻易地获取每个属性上的验证条件,并调用Validate方法进行验证。我们有能力这么做的原因,是因为C#中的 Attribute是类,这样我们可以使用抽象类ValidationAttribute进行统一控制。如果这段验证逻辑是由类库提供的,而开发人员想要增加额外的验证条件,也只需要自己定义新的类来继承ValidationAttribute,并提供自定义的Validate方法逻辑即可。这种方式大量出现在各类.NET的类库及框架中,给.NET程序员带来许多便利。
更多精彩
赞助商链接