2011-05-25 71 views
6

添加验证我有一对夫妇,我在C#中定义的变量:C#在setter方法

public String firstName { get; set; } 
public String lastName { get; set; } 
public String organization { get; set; } 

我要的是,当你尝试设置的值添加验证这些方法。假设你要为firstName设置一个值,那么我应该通过thrue来设置一个正则表达式,否则应该抛出一个异常。这可能是用这个“短语法”来构建的,还是应该用标准(比如JAVA)getter和setter来验证数据?

回答

25

如果要验证属性何时设置,则需要使用非自动属性(即,手动定义的getset方法)。

但另一种验证方法是验证逻辑与域对象分开。

class Customer { 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Organization { get; set; } 
} 

interface IValidator<T> { 
    bool Validate(T t); 
} 

class CustomerValidator : IValidator<Customer> { 
    public bool Validate(Customer t) { 
     // validation logic 
    } 
} 

然后,你可以说:

Customer customer = // populate customer 
var validator = new CustomerValidator(); 
if(!validator.Validate(customer)) { 
    // head splode 
} 

这是方法,我喜欢:

  1. 一个Customer不应该负责验证自己的数据,那就是另一responsibility,因此应该住在别处。
  2. 不同的情况为相同的域对象调用不同的验证逻辑。
+3

我不同意,即使您的验证失败,您的客户数据也无效。如果你搞砸了外部验证,如何阻止它将垃圾写入数据库? – Blindy 2011-05-25 15:58:47

+0

@Bindy:你的持久层应该连接验证器,如果验证失败,验证器不会持续。 – jason 2011-05-25 15:59:51

+0

@Bindind客户不应该负责写入数据库。这是客户不应该承担的另一项责任。 – Phil 2011-05-25 16:02:05

6

你现在所称的“自动属性”,只执行一个简单的“get/set”。为了定制getset的行为,您需要将属性转换到现场支持的特性:

private string _firstName; 
public string FirstName 
{ 
    get {return _firstName;} 
    set 
    { 
     Validate(value); _firstName = value; 
    } 
} 

注意,我改变Stringstring和资本属性的名称,在下面接受C#命名最佳实践。

+0

它应该不是验证(值)? – TDull 2014-01-23 11:23:18

+0

@TDull:是的,我修好了。 :-) – StriplingWarrior 2014-01-23 16:17:17

0

你必须使用完整的属性语法。

3

我不会在setter中添加验证。相反,我会创建一个名为validate的函数,而不是......这样,所有的验证代码都在一个点上,而不是整个setters