实现类数据验证

时间:2011-06-02 19:31:08

标签: c# validation serialization correctness

我有一个代表某个空中隧道的物理特征的物体:

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可能有很少的无效参数。我该如何返回错误并处理它们?程序必须在一次调用中返回所有找到的错误。这种方式只适用于我自己使用的类。在每次编辑数据后,我可能无法强迫其他程序员使用验证。

请给我一个建议,如何更正确地实现这样的值检查并解决我的问题 - 可能是另一种灵活的方式,以便将来易于管理和改进此代码。谢谢。

编辑:回到我的第一个想法,有没有办法在序列化期间或之后验证数据?

4 个答案:

答案 0 :(得分:4)

最简单的方法:

//Returns empty list if no errors.
public List<TunnelErrors> Validate()
{
    //Validate params
}

答案 1 :(得分:1)

我想到的是这个。

我会保留一个只读的IsValid属性。在吸气剂上,我会做所有验证并说出真或假。

在我使用该对象的任何地方,我会检查object.IsValid是否为真。

答案 2 :(得分:1)

尝试让你的文件每次都通过一个包装函数,并使普通用户的磁盘上的文件只读,即,如果用户必须编辑文件,他只能通过你的程序,当用户完成时编辑你通过你的函数传递所有数据,看看整个数据是否仍然有效,

答案 3 :(得分:1)

对于编辑:使序列化流通过一个缓冲区函数,该函数在序列化之前或期间处理数据,具体取决于哪种方式更容易实现,如果选择前者,数据将首先是验证(返回类型和参数类型将相同)然后被序列化,否则数据将在转换时被检查..