2015-11-04 69 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当你收到它。