2012-03-22 80 views
1

我有一个类如何检查对象的某些属性不为空在C#

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

我工作了A类的目标,并填充用户输入的类。 每个不同的目标意味着需要不同的属性(不为空/空)。

所以如果我的目标是香蕉,那么propA和propB一定不能是空的。如果苹果,那么propB和propC一定不能是空的。我需要这样做在应用程序的开始跟不上在后一阶段做检查,因为一些方法和数据库调用将需要的数据等

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

上面的例子只有3个属性,但什么我实际上需要做的多了堆。

我只是开始寻找方法来验证我的代码。

总之,这个问题有两个部分。 - 如何检查类的属性是否为空 - 储存不同的地方结合所需的属性的列表来对付如何检查

编辑:对不起!我已编辑希望更有意义。

+10

属性总是存在,因为它们是类定义的一部分。那么你究竟想要做什么? – Jon 2012-03-22 07:51:17

+1

你说你的班级是通用的,另一方面,班级本身并不是通用班级。 – daryal 2012-03-22 07:53:17

+3

“你是否存在财产”是指什么?你的意思是你想检查一个特定类的实例并验证指定的属性是否有一个非空的值集,或者你的意思是你想检查一个类型并查看它是否实际定义了一组特定的属性? – PHeiberg 2012-03-22 07:53:56

回答

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)与任何对象或通用参数。但对我来说反射是邪恶的:)尝试通过设计来解决这个问题。

0

我想你的意思是说,当你说一个属性存在的验证。

您还没有指定如果一个网站或Win窗体/ WPF应用程序(或whatelse)。

你可以在你的类实现IDataErrorInfo的和验证,如果属性已填权。

有吨的例子来找到IDataErrorInfo的+验证谷歌搜索时,但这里有一些这让我过去:

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

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比你可以使用上面的方法...

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

相关问题