覆盖内部/子类字段

时间:2015-11-04 20:07:05

标签: c# .net class

我目前有一位'客户'看起来像这样的类:

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 个答案:

答案 0 :(得分:1)

无论它有什么价值,我都会重新考虑在构造函数中抛出异常。这样做会导致异常被运行时捕获并重新抛出为ObjectInitializationException - 一个完全在您控制之外的操作。这些异常可能模糊不清,难以确定,特别是对于不熟悉对象模型的开发人员。

您可能会做的是在CustomerRequest对象上放置一个验证方法,该方法验证是否填充了所有必填字段(在本例中为电子邮件地址)。当然,它需要一个手动方法调用,但它是明确的,并且在运行时它不会让您感到意外。

答案 1 :(得分: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时,你最好再验证一下。

答案 2 :(得分: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;
    }
}