如何验证类属性?

时间:2014-01-09 18:07:17

标签: c# validation csv

背景:

我有一个CSV文件,我需要准备好并验证每一行中的每个元素,并创建一个具有有效数据的类的集合。

即 CSV文件如下所示:

   EmpID,FirstName,LastName,Salary
    1,James,Help,100000
    2,Jane,Scott,1000
    3,Mary,Fraze,10000

类看起来像:

public class Employees
    {
        public int EmpID { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Salary { get; set; }
        public string ErrorReason { get; set; }
    }

以下是每个字段所需的验证:

  • 的EmpID:

    • 它是必填字段,因此不能为空或空
    • 它应该只是一个整数
    • 不应超过2位
    • 它应该存在于数据库中(查询该数据库并检查员工是否以此empid退出。
  • FirstName(LastName的相同验证):

    • 它是必填字段,因此不能为空或空
    • 它应该只是字母。
    • 允许不超过30个字符
  • 薪酬:

    • 它是必填字段,因此不能为空或空
    • 应该是小数。

为实现这一目标,这是我的方法:

  1. 逐行阅读CSV文件
  2. 对于每个元素,即EmpId,FirstName ......等通过调用具有验证逻辑的单个方法来执行所需的验证。 例如: public bool ValidateIsDecimal(string value){} public bool ValidateIsEmpIdExists(string value){} 等
  3. 如果有效,请填写"员工"的相应财产。类。
  4. 如果无效,请填写" ErrorReason"属性,以及是否导致验证失败的原因。(例如:缺少必填字段或数据类型不是小数等)
  5. 将此类添加到Employees集合(例如:List)
  6. 所以,我的问题是,这是正确的方法,还是有其他更好/更清晰的方法来验证类属性。

    由于

1 个答案:

答案 0 :(得分:6)

我会考虑使用C# DataAnnotations命名空间。我经常将它们用于MVC模型,它们非常有用。

我认为这会有所帮助的原因是您可以尝试在try / catch块中创建一个新的Employees对象并捕获ValidationExceptions,例如:

List<Employees> empList = new List<Employees>();

foreach (var row in csvRows){
    try {
        //Parse the row here and create the object. don't do any validation here
        var employee = CreateEmployeeFromRow(row);  
        empList.Add(employee);
    }
    catch (ValidationException ve){
        //do whatever
    }
}

你的课程看起来像是:

using System.ComponentModel.DataAnnotations;

public class Employees
{
    [Required, RangeAttribute(0, 99)]
    public int EmpID { get; set; }
    [Required, Length(30), RegularExpression("/^[A-Za-z]+$/")]
    public string FirstName { get; set; }
    [Required, Length(30), RegularExpression("/^[A-Za-z]+$/")]
    public string LastName { get; set; }
    [Required]
    public decimal Salary { get; set; }
}

至于避免重复的员工ID,我会在插入数据库之前检查一下。这并没有真正使Employees对象无效(或CSV中的行无效,因为它是正确的格式)。