如何验证类属性?

2024-01-19

背景:

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

IE 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 退出)。
  • 名字(对姓氏进行相同的验证):

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

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

为了实现这一目标,我的方法如下:

  1. 逐行读取CSV文件
  2. 对于每个元素,即 EmpId、FirstName...等通过调用具有验证逻辑的各个方法来执行所需的验证。例如: 公共 bool ValidateIsDecimal(字符串值) { } 公共布尔ValidateIsEmpIdExists(字符串值){} ETC
  3. 如果有效,则填写“Employees”类的相应属性。
  4. 如果无效,请填写“ErrorReason”属性,并提供导致验证失败的适当原因。(例如:缺少必需的字段或数据类型不是十进制等)
  5. 将此类添加到员工集合(例如:列表)

所以,我的问题是,这是正确的方法吗,还是有其他更好/更干净的方法来验证类属性。

Thanks


我会考虑使用C# 数据注释 http://msdn.microsoft.com/en-us/library/dd901590%28v=vs.95%29.aspx命名空间。我经常将它们用于 MVC 模型,它们非常有帮助。

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

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,我会在插入数据库之前检查一下。这并不会真正使员工对象无效(或者 CSV 中的行无效,因为它是正确的格式)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何验证类属性? 的相关文章

  • 在 C++ 中使用 matlab 结构(matlab 函数调用的返回值)(由 matlab 编译器生成的库)

    你好 我有一个相当简单的 matlab 函数 例如 function MYSTRUCT myfunc MYSTRUCT prop1 test MYSTRUCT prop2 foo MYSTRUCT prop3 42 end 我用 matla
  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • Mac 应用程序商店 - 尝试让加密发挥作用。 。 。我缺少什么?

    我正在尝试使用 Alan Quartermain 的解决方案 如该问题所链接 Mac App Store 收据验证码 https stackoverflow com questions 4261348 mac app store recei
  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 使用 Newtonsoft 和 C# 反序列化嵌套 JSON

    我正在尝试解析来自 Rest API 的 Json 响应 我可以获得很好的响应并创建了一些类模型 我正在使用 Newtonsoft 的 Json Net 我的响应中不断收到空值 并且不确定我的模型设置是否正确或缺少某些内容 例如 我想要获取
  • 如何创建包含 IPv4 地址的文本框? [复制]

    这个问题在这里已经有答案了 如何制作一个这样的文本框 我想所有的用户都见过这个并且知道它的功能 您可以使用带有 Mask 的 MaskedTestBox000 000 000 000 欲了解更多信息 请参阅文档 http msdn micr
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

    我创建了一个自定义库 它会自动为依赖于特定服务的 Polly 策略设置HttpClient 这是使用以下方法完成的IServiceCollection扩展方法和类型化客户端方法 一个简化的例子 public static IHttpClie
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • 如何检测表单的任何控件的变化?

    如何检测 C 中表单的任何控件的更改 由于我在一个表单上有许多控件 并且如果表单中的任何控件值发生更改 我需要禁用按钮 我正在寻找一些内置函数 事件处理程序 属性 并且不想为此创建自定义函数 不 我不知道任何时候都会触发任何事件any控制表
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • C# 中的合并运算符?

    我想我记得看到过类似的东西 三元运算符 http msdn microsoft com en us library ty67wk28 28VS 80 29 aspx在 C 中 它只有两部分 如果变量值不为空 则返回变量值 如果为空 则返回默
  • 为什么 std::strstream 被弃用?

    我最近发现std strstream已被弃用 取而代之的是std stringstream 我已经有一段时间没有使用它了 但它做了我当时需要做的事情 所以很惊讶听到它的弃用 我的问题是为什么做出这个决定 有什么好处std stringstr
  • CMake 无法确定目标的链接器语言

    首先 我查看了this https stackoverflow com questions 11801186 cmake unable to determine linker language with c发帖并找不到解决我的问题的方法 我
  • “接口”类似于 boost::bind 的语义

    我希望能够将 Java 的接口语义与 C 结合起来 起初 我用过boost signal为给定事件回调显式注册的成员函数 这非常有效 但后来我发现一些函数回调池是相关的 因此将它们抽象出来并立即注册所有实例的相关回调是有意义的 但我了解到的
  • 如何在非控制台应用程序中查看 cout 输出?

    输出到调试窗口似乎相当繁琐 我在哪里可以找到cout如果我正在编写非控制台信息 则输出 Like double i a b cout lt lt b lt lt endl I want to check out whether b is z
  • 调用堆栈中的“外部代码”是什么意思?

    我在 Visual Studio 中调用一个方法 并尝试通过检查调用堆栈来调试它 其中一些行标记为 外部代码 这到底是什么意思 方法来自 dll已被处决 外部代码 意味着该dll没有可用的调试信息 你能做的就是在Call Stack窗口中单
  • 我的班级应该订阅自己的公共活动吗?

    我正在使用 C 3 0 遵循标准事件模式我有 public event EventHandler
  • 如何将 PostgreSql 与 EntityFramework 6.0.2 集成? [复制]

    这个问题在这里已经有答案了 我收到以下错误 实体框架提供程序类型的 实例 成员 Npgsql NpgsqlServices Npgsql 版本 2 0 14 2 文化 中性 PublicKeyToken 5d8b90d52f46fda7 没

随机推荐