我有一个代表某个空中隧道的物理特征的物体:
public class Tunnel
{
public double Length { get; set; }
public double CrossSectionArea { get; set; }
public double AirDensity { get; set; }
public double Pressure { get; set; }
//...
}
我需要检查参数的正确性:例如,长度必须是> 0
,压力>= 0
等等。第一个想法只是将检查放到属性访问器并在无效数据上抛出异常:
public class Tunnel
{
private double length;
public double Length
{
get { return length; }
set
{
if (value <= 0)
throw new TunnelParametersException("Invalid data");
length = value;
}
//...
}
但是我有一个这样的对象的集合,它将被序列化/反序列化为XML文件。所以问题是它不能用于序列化(如果我没有弄错的话)。用户可以编辑文件并输入他想要的任何内容,但我无法抓住它。
所以,据我所知,需要创建一些函数(在Tunnel
类或另一个中),我将调用它来检查所有值是否正确。但是这里有另一个问题:Tunnel
可能有很少的无效参数。我该如何返回错误并处理它们?程序必须在一次调用中返回所有找到的错误。这种方式只适用于我自己使用的类。在每次编辑数据后,我可能无法强迫其他程序员使用验证。
请给我一个建议,如何更正确地实现这样的值检查并解决我的问题 - 可能是另一种灵活的方式,以便将来易于管理和改进此代码。谢谢。
编辑:回到我的第一个想法,有没有办法在序列化期间或之后验证数据?
答案 0 :(得分:4)
最简单的方法:
//Returns empty list if no errors.
public List<TunnelErrors> Validate()
{
//Validate params
}
答案 1 :(得分:1)
我想到的是这个。
我会保留一个只读的IsValid属性。在吸气剂上,我会做所有验证并说出真或假。
在我使用该对象的任何地方,我会检查object.IsValid是否为真。
答案 2 :(得分:1)
尝试让你的文件每次都通过一个包装函数,并使普通用户的磁盘上的文件只读,即,如果用户必须编辑文件,他只能通过你的程序,当用户完成时编辑你通过你的函数传递所有数据,看看整个数据是否仍然有效,
答案 3 :(得分:1)
对于编辑:使序列化流通过一个缓冲区函数,该函数在序列化之前或期间处理数据,具体取决于哪种方式更容易实现,如果选择前者,数据将首先是验证(返回类型和参数类型将相同)然后被序列化,否则数据将在转换时被检查..