我目前有一位'客户'看起来像这样的类:
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类中覆盖它们。
如何实现我想要的功能?
答案 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;
}
}