2011-05-25 51 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