我有一个代表某些风洞物理特性的对象:
public class Tunnel
{
public double Length { get; set; }
public double CrossSectionArea { get; set; }
public double AirDensity { get; set; }
public double Pressure { get; set; }
//...
}
我需要检查参数的正确性:例如,Length必须是> 0
,Pressure >= 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文件/从XML文件反序列化。所以问题是它不能与序列化一起工作(如果我没有错的话)。用户可以编辑文件并输入任何他想要的,我将无法捕捉它。
因此,据我所知,需要创建一些函数(在Tunnel
类或另一个类中),我将调用它来检查所有值是否正确。但这里还有一个问题:Tunnel
可能有几个无效参数。我应该如何返回错误并进行处理?程序必须在一次调用中返回所有找到的错误。这种方式只适合我自己使用类。我可能不能强迫另一个程序员在每次编辑数据后使用验证。
请给我一个建议,如何更正确地实现这种值检查并解决我的问题——也许还有其他灵活的方法,以便在未来更容易管理和改进此代码。非常感谢。
EDIT:回到我的第一个想法,有什么方法可以在序列化期间或之后验证数据吗?
最简单的方法:
//Returns empty list if no errors.
public List<TunnelErrors> Validate()
{
//Validate params
}
我想到的是这个。
我会保留一个只读的IsValid属性。在getter上,我会做所有的验证,说是真是假。
在我使用该对象的任何地方,我都会检查该对象是否存在。IsValid为true。
尝试让你的文件每次都通过包装器函数,并让磁盘上的文件对普通用户只读,即,如果用户必须编辑文件,他只能通过你的程序来编辑,当用户完成编辑后,你通过你的函数传过所有数据,看看整个数据是否仍然有效,
对于编辑:使序列化流通过一种缓冲函数,该函数在序列化之前或期间处理数据,具体取决于哪种方式更容易实现,如果选择前者,数据将首先经过验证(返回类型和参数类型相同),然后进行序列化,否则,数据将在转换时进行检查。。