如何validation类属性?
背景:
我有一个CSV文件,我需要准备好并validation每一行中的每个元素,并创建一个具有有效数据的类的集合。
即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; } }
以下是每个字段所需的validation:
-
的EmpID:
- 它是一个必填字段,因此不能为空或空
- 它应该只是一个整数
- 它应该不超过2位数
- 它应该存在于数据库中(查询该数据库并检查员工是否以此empid退出。
-
FirstName(LastName的相同validation):
- 它是一个必填字段,因此不能为空或空
- 它应该只是字母表。
- 不允许超过30个字符
-
薪水:
- 它是一个必填字段,因此不能为空或空
- 它应该是小数。
要做到这一点,这是我的方法:
- 逐行读取CSV文件
- 对于每个元素,即EmpId,FirstName等,通过调用具有validation逻辑的单个方法来执行所需的validation。 例如:public bool ValidateIsDecimal(string value){} public bool ValidateIsEmpIdExists(string value){} etc
- 如果有效,请填写“Employees”类的相应属性。
- 如果NOT VALID,请填写“ErrorReason”属性,并说明导致validation失败的原因。(例如:缺少必填字段或数据类型不是小数等)
- 将此类添加到Employees集合(例如:List)
所以,我的问题是,这是正确的方法,还是有任何其他更好/更清洁的方法来validation类属性。
谢谢
我会考虑使用C#DataAnnotations命名空间。 我经常将它们用于MVC模型,它们非常有用。
我认为这有用的原因是你可以尝试在try / catch块中创建一个新的Employees对象并捕获ValidationExceptions,例如:
List empList = new List (); 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中的行无效,因为它是正确的格式)。