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

C# 如何在C中检查对象的某些属性是否为空#,c#,validation,C#,Validation,我有一节课 class A { propA { get; set; } propB { get; set; } propC { get; set; } target { get; set; } } 我计算出类A的目标,并用用户输入填充该类。 每个不同的目标都意味着需要不同的类属性(不是空/空) 所以,如果我的目标是香蕉,那么propA和propB不能为空。如果是apple,则propB和propC不能为空。我需要在应用程序开始时这样做,以免在以后的阶段继续进行检

我有一节课

class A {
    propA { get; set; }
    propB { get; set; }
    propC { get; set; }
    target { get; set; }
}
我计算出类A的目标,并用用户输入填充该类。 每个不同的目标都意味着需要不同的类属性(不是空/空)

所以,如果我的目标是香蕉,那么propA和propB不能为空。如果是apple,则propB和propC不能为空。我需要在应用程序开始时这样做,以免在以后的阶段继续进行检查,因为某些方法和DB调用将需要数据等

最好的编码方式是什么?甚至是设计方面。 在枚举中存储每个目标所需的属性是否是一种良好做法?然后使用lazyberezovsky在下面提供的内容进行检查

上面的例子只有3个属性,但实际上我需要做的是更多的堆

我刚刚开始寻找验证代码的方法

总而言之,这个问题分为两个部分。 -如何检查类的属性是否为空 -将不同组合所需属性的列表存储在某个位置,以用于检查


编辑:对不起!我编辑了这篇文章,希望能让这篇文章更有意义。

让我试着猜一下这个问题是关于什么的:)

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

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;
    }
}
公共类类型验证程序
{
公共bool IsPropertyExists(字符串propertyName)
{
类型=类型(T);
BindingFlags=BindingFlags.Instance | BindingFlags.Public;
foreach(type.GetProperties(标志)中的PropertyInfo属性)
if(property.Name==propertyName)
返回true;
返回false;
}
}
与您的类一起使用:

TypeValidator<a> validator = new TypeValidator<a>();
validator.IsPropertyExists("PropB")
TypeValidator validator=新的TypeValidator();
验证器.IsPropertyExists(“PropB”)

或者,您可以将其用作扩展方法
公共静态bool IsPropertyExists(此T T,string propertyName)
和任何对象或泛型参数。但对我来说,反射是邪恶的:)试着通过设计来解决这个问题。

我想当你说某个属性存在时,你指的是验证

您尚未指定它是Web应用程序还是Win Form/Wpf应用程序(或whatelse)

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

谷歌搜索IDataErrorInfo+Validate时,有很多例子可以找到,但这里有一些在过去帮助过我的例子:


我想你想要的是模型验证。如果是这样,那么将验证逻辑放在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;
   }
}
A类
{
可为空的propA{get;set;}
int?propB{get;set;}
int?propC{get;set;}
字符串目标{
获取{return\u target;}
集合{
var oldtarget=_target;
_目标=价值;
if!IsValid()
{
_目标=旧目标;
抛出新异常(“将目标设置为”
+价值观
+“不可能,……”;
}
} 
}
公共bool是有效的()
{
开关(_目标)
{
案例“香蕉”:
返回propA.HasValue()&&propB.HasValue();
案例“苹果”:
返回propB.HasValue()&&propC.HasValue();
}
返回true;
}
}
如何检查propA是否为空?取决于propA是什么。。。是整数吗?笨蛋?一根绳子?等假设它是一个int,那么您可以使用上面的方法


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

属性总是存在的,因为它们是类定义的一部分。那么你到底想做什么呢?你说你的类是泛型的,另一方面,这个类本身不是泛型的。你说的“如果属性存在”是什么意思?您的意思是要检查特定类的实例并验证指定的属性是否具有非空值集,还是要检查类型并查看它是否实际定义了特定的属性集?您需要对此进行更多解释。。。例如,当这样一个属性存在/不存在时,有更新的问题。我的意思是,如果属性已填充且不为空或null。