4

感谢您的关注和时间。

我想在属性设置器中实现验证。这是一个需要您的专家帮助的问题。

我知道在设置值之前如何进行验证。但如果传递的值不正确,则不知道该怎么做。只是不设置不是一个可接受的解决方案,因为我想向用户返回适当的消息(在 Web 表单的标签中)。我的示例代码是:

private  int id;
public int Id
{
    get
    { return id; }

    set
    {
        bool result = IsNumber(value);
        if (result==false)
        {
            // What to do if passed data is not valid ? how to give a appropriate message to user that what is wrong ?
        }

        id = value;
    }
}

一个想法是使用 return 但这是不允许的。

抛出错误看起来不太好,因为通常我们会避免抛出自定义错误。

请指导和帮助我。

期待中的感谢

韩丝

4

4 回答 4

1

我认为您最好改用另一个示例,因为:

public int Id
{
  get { ... }
  set 
  { 
      if (!IsNumer(value)) // changes to if (value>5)
      {
            //the code here will never be executed
           id = value;
      }
  }
}
于 2010-06-08T07:45:53.607 回答
1

您可以考虑从属性设置器中抛出适当的异常。这样,调用方就可以清楚地知道出了什么问题,尤其是假设您有关于设置属性的业务规则。当然,您确实希望调用者进行验证,如果仍然存在问题,那么抛出异常似乎并没有那么糟糕。

“从属性设置器中抛出异常是有效且可接受的。” 物业设计指南

最佳实践:从属性中抛出异常

从属性设置器抛出什么异常?

于 2010-06-08T09:39:39.670 回答
0
  1. 如果检查只是关于数字(类型),那么您的财产可以很好地处理类型安全。例如。用户将无法将字符串分配给接受 int 的属性。

  2. 我建议如果 Property 涉及某些计算,那么应该考虑使用一种方法。在这种情况下,您将选择获取一些文本作为回报。

  3. 另一种选择是将所有这些验证检查存储在一个实例集合中(在同一个对象内)。像。

    私有列表_faileValdations;

//更多代码

    set
    {
    if (!IsNumber(value))
    {
    _faileValdations.Add("Invalid value for xxx. Expected... got..");
    }
    else{
        id = value;
    }
    }

然后,您的 GUI 可以最终读取 FailedValidations 集合,并在某个标签中以格式化的方式显示它。

编辑:下面还有一个选项。

  1. 抱歉,我之前忘了提这个。

您也可以使用事件驱动的方法。您的对象可以公开类似“ValidationFailed”的事件,并且所有 GUI 对象都可以订阅此事件。如果设置器中的任何验证失败,该对象将触发此事件。

    set {
    if (!IsNumber(value))
    {
    RaiseValidationFailed("some message");
    }
    else{
        id = value;
    }
    }

“RaiseValidationFailed”可以收集消息,将其包装在一些事件参数中,并用该消息触发“ValidationFailed”事件。然后 GUI 可以对此做出反应。{如果不清楚,我可以为您提供完整的代码}

于 2010-06-08T07:44:20.150 回答
0

我认为你应该重新考虑你的验证方法。您建议的方法意味着每次属性更改时都会生成一条消息。

这些信息将如何收集、存储和呈现?特别是如果您决定在网站上使用您的课程?

如果您想在其他任何时间验证您的课程怎么办?

如果您想在客户端验证中使用相同的规则怎么办?

我可以理解尽早捕获无效值的吸引力,但是在一次调用(例如 Validate() 方法)中验证整个类要容易得多。这样,您就可以完全控制验证逻辑的运行时间。

我建议您阅读两种主要的属性验证方法:

数据注释

>NET 3.0 及更高版本的流利验证

.NET 2.0 的流利验证

Data Annotations 和 FluentValidation 都易于使用,它们能够在 Web 表单和 win 表单上生成经过良好测试的客户端验证。

在数据注释中,使用属性将验证添加到属性中。如果您希望将数据类保持为干净的数据传输对象,Fluent 验证涉及在 Validator 类中创建易于阅读的规则。

于 2010-06-08T08:14:01.863 回答