2015-11-04 72 views
0

我現在有一個「客戶」類,看起來像:重寫內/子領域

public class Customer 
{ 
    public string email { get; set; }       
    public string first_name { get; set; }      
    public string middle_name { get; set; }      
    public string last_name { get; set; }      
} 

不過,我也有另一個類封裝了「客戶」爲REST「GET」請求的一部分:

public class CustomerRequest 
{ 
    Customer customer; 
} 

在我的CustomerRequest中,我想使電子郵件字段爲必填字段。換句話說,如果在創建對象時未輸入電子郵件,我想重寫Customer類的默認行爲以引發ArgumentNullException。我只想強制執行這一要求,作爲CustomerRequest的一部分,而不是客戶。

我試圖讓底層的Customer類字段'虛擬',但是這仍然不允許我在CustomerRequest類中重寫它們。

我該如何達到我想要的功能?

+3

'new CustomerRequest(string email)',然後將Customer.email屬性設置爲CustomerRequest .ctor中提供的電子郵件。 –

+0

'我試圖讓底層的Customer類字段'虛擬',但是這仍然不允許我在CustomerRequest類中覆蓋它們。'當然不是。 'CustomerRequest'不會從'Customer'繼承,所以它不能覆蓋它。如果你想覆蓋它,那麼你需要繼承'Customer'。 –

+0

你使用MVC/WebApi嗎? –

回答

1

無論它值什麼,我都會重新考慮在構造函數中拋出異常。這樣做會導致異常被運行時捕獲並重新拋出爲ObjectInitializationException - 這是完全不受控制的操作。這些例外情況可能比較晦澀難懂,特別是對不熟悉對象模型的開發人員。

您可能會做的是在CustomerRequest對象上放置一個驗證方法,驗證是否填充了所有必填字段(在本例中爲電子郵件地址)。當然,它需要一個手動的方法調用,但它是明確的,並且它在運行時不會意外地讓你感到驚訝。

+0

這似乎是對別人的回答的評論,而不是對OP的回答。 –

+1

是和不是。他想在構造對象時拋出異常。我提出了另一種解決方案,可以從維護角度更有效地爲他提供服務。 –

0
public CustomerRequest 
{ 
    public Customer customer {get;set;} 

    public CustomerRequest(Customer c) 
    { 
     this.customer = CheckEmail(c); 
    } 

    private Customer CheckEmail(Customer c) 
    { 
     if (c.email == null) throw ArgumentNullException; 
     return c; 
    } 
} 
1

簡答:您不能僅僅因爲它是另一個類中的字段而改變Customer的行爲。

較長的答案:有幾種方法可以實現您要查找的內容。 @ MetroSmurf的答案很可能是最簡單的,但你也可以改變customer領域上CustomerRequest是一種財產,執行檢查也即

public class CustomerRequest 
{ 
    private Customer _customer; 
    public Customer Customer 
    { 
     get { return _customer; } 
     set 
     { 
      if (string.IsNullOrEmpty(value.email)) 
      { 
       throw new ArgumentNullException("email"); 
      } 
      _cutomer = value; 
     } 
    } 
} 

但說實話,你只是會更好驗證CustomerRequest當你收到它。