使用自定义属性验证C#类字段

时间:2010-08-23 09:50:50

标签: c#-4.0

class Employee
{
  [ValueNotEmpty("Empty strings not allowed"]
  public string Name{get;set;}
}

"ValueNotEmpty"是一个自定义属性。我尝试使用YABOV库但我必须显式调用基类的Validate方法来验证自定义属性并返回验证消息。

在实现类中,我使用反射来设置"Name"字段的值。当我在"Name"字段上设置值时,我希望try块抛出一个异常"Empty strings not allowed"。有什么方法可以做到这一点,而不是在我为字段设置值时显式调用一个方法来验证类?。

2 个答案:

答案 0 :(得分:0)

你可以尝试从IDataErrorInfo继承并实现如下,但我想这是你明确调用验证的意思。

public class Employee : IDataErrorInfo
{
  public string Name{get;set;}

  string IDataErrorInfo.Error {get {return null;}}

  string IDataErrorInfo.this[string propertyName]
  {
    get { return this.GetValidationError(propertyName);}
  }

  string GetValidationError(string propertyName)
  {
    string error = null;
    switch(propertyName)
    {
      case "Name":
        error = ValidateName();
        break;
     default:
        error = "Unknown proeprty";
        break;
    }
  }

  string ValidateName()
  {
    if(!string.IsNullOrEmpty(this.Name))
    {
      return null;
    }
    return "Empty Name";
  }
}

答案 1 :(得分:0)

对这个问题的一些想法:

如果您的属性调用PropertyChanged事件,则可能有一种机制使用它来验证它。例如,与数据绑定相结合。如果您没有PropertyChanged,则需要显式调用Validate,除非您使用的是AOP。

设置值时执行代码需要AOP。在.Net标准库中,没有包含AOP技术,您必须集成一个(例如Spring)。 AOP需要代码生成或字节码增强。所以这不是一件小事。