如何在C#中检查对象的某些属性是否为空

时间:2012-03-22 07:49:30

标签: c# validation

我有一个班级

class A {
    propA { get; set; }
    propB { get; set; }
    propC { get; set; }
    target { get; set; }
}

我计算出A类的目标,并用用户输入填充该类。 每个不同的目标都意味着需要不同类的属性(不是空/ null)。

因此,如果我的目标是香蕉,那么propA和propB不能为空。如果是apple,那么propB和propC一定不能为空。我需要在应用程序启动时执行此操作,以便不在后续阶段进行检查,因为某些方法和数据库调用将需要数据等。

编码此代码的最佳方法是什么?甚至是设计明智的。 在枚举中存储每个目标所需的属性是一种好的做法吗?然后使用下面提供的lazyberezovsky来检查??

上面的例子只有3个属性,但我实际需要做的事情还有更多。

我才开始研究验证代码的方法。

总之,这个问题有两个部分。   - 如何检查类的属性是否为空   - 在某处使用不同的组合所需属性的列表来存储如何检查

编辑:对不起!我已经编辑过,希望能更好地理解这一点。

3 个答案:

答案 0 :(得分:2)

让我试着猜猜是什么问题:)

这是类型验证器,它可以检查参数的公共属性是否存在:

public class TypeValidator<T>
{
    public bool IsPropertyExists(string propertyName)
    {
        Type type = typeof(T);
        BindingFlags flags = BindingFlags.Instance | BindingFlags.Public;
        foreach (PropertyInfo property in type.GetProperties(flags))
            if (property.Name == propertyName)
                return true;

        return false;
    }
}

与您的班级一起使用:

TypeValidator<a> validator = new TypeValidator<a>();
validator.IsPropertyExists("PropB")

或者您可以将它用作任何对象或泛型参数的扩展方法public static bool IsPropertyExists<T>(this T t, string propertyName)。但对我来说,反思是邪恶的:)尝试通过设计来解决这个问题。

答案 1 :(得分:1)

我认为你所追求的是模型验证。如果是这样,也许放置验证逻辑的好地方是A类方法,如下所示:

Class A
{
   Nullable<int> propA { get; set; }
   int? propB { get; set; }
   int? propC { get; set; }
   string target { 
      get { return _target; } 
      set { 
         var oldtarget = _target;
         _target = value; 
         if !IsValid() 
         {
             _target = oldtarget;
             throw new Exception("Setting target to " 
                        + value 
                        + " is not possible, ....");
         }
      } 
   }

   public bool IsValid()
   {
       switch (_target)
       {
           case "banana":
              return propA.HasValue() && propB.HasValue();

           case "apple":
              return propB.HasValue() && propC.HasValue();
       }

       return true;
   }
}

如何检查propA是空的?取决于propA是什么......它是一个int吗?一个博尔?一个字符串?等...假设它是一个int而不是你可以使用上面的方法...

不能想到比IsValid()更“通用”的验证,也就是说,我想不出更通用的方法来验证而不知道更多......

答案 2 :(得分:0)

我猜你的意思是在你说房产存在时进行验证。

您尚未指定是否为Web或Win Form / Wpf应用程序(或whatelse)。

您可以在类上实现IDataErrorInfo并验证属性是否已正确填充。

在使用IDataErrorInfo + Validate进行Google搜索时,有大量示例可供查找,但以下是帮助我的一些例子:

http://www.arrangeactassert.com/using-idataerrorinfo-for-validation-in-mvvm-with-silverlight-and-wpf/

How to validate child objects by implementing IDataErrorInfo on parent class