C# 如何检查空对象?

C# 如何检查空对象?,c#,object,reflection,is-empty,C#,Object,Reflection,Is Empty,我有很多东西。其中有些具有字符串属性,有些具有布尔属性。我以多步骤的形式使用它们。因此,每个步骤都绑定到每个对象 现在,如果用户填充前两个部分并将数据保存为用户希望稍后填充其余数据。在这一点上,我需要确定填充了多少数据,剩下多少数据。因此,下次加载表单时,根据之前填写的数据,我可以确定从何处开始填写表单 我试图在保存时确定有多少对象具有值。换句话说,如果我找到一个包含所有值的对象,例如空字符串,我可以跳过该对象保存到数据库中。我引用了这篇文章,它展示了如何检查具有所有字符串属性的空对象 如何在该

我有很多东西。其中有些具有字符串属性,有些具有布尔属性。我以多步骤的形式使用它们。因此,每个步骤都绑定到每个对象

现在,如果用户填充前两个部分并将数据保存为用户希望稍后填充其余数据。在这一点上,我需要确定填充了多少数据,剩下多少数据。因此,下次加载表单时,根据之前填写的数据,我可以确定从何处开始填写表单

我试图在保存时确定有多少对象具有值。换句话说,如果我找到一个包含所有值的对象,例如空字符串,我可以跳过该对象保存到数据库中。我引用了这篇文章,它展示了如何检查具有所有字符串属性的空对象

如何在该检查中也包括布尔属性?e、 g.如果对象有10个bool属性,并且所有属性都为false,那么我需要将该对象标识为空


因此,为了总结上述问题,如何识别对象是否为空白,并且具有布尔或字符串属性?

您可以通过简单的检查来检查它:

obj==null | | obj==String.Empty


这将检查
null
和“空”条件。

您可以通过简单的检查进行检查:

obj==null | | obj==String.Empty


这将检查
null
和“empty”条件。

从技术上讲,您可以将反射和Linq组合成如下内容:

  Object obj = ...

  // All Empty (false or null) public properties of either string or bool type
  PropertyInfo[] emptyProps = obj
    .GetType()
    .GetProperties(BindingFlags.Instance | BindingFlags.Public)
    .Where(prop => prop.CanRead) // you may want to check prop.CanWrite as well
    .Where(prop => prop.PropertyType == typeof(bool) || 
                   prop.PropertyType == typeof(string))
    .Where(prop => object.Equals(prop.GetValue(obj), 
                                 prop.PropertyType.IsValueType 
                                   ? Activator.CreateInstance(prop.PropertyType) 
                                   : null))
    .ToArray();
但是,我怀疑您是否应该这样做:某些属性不应保存:

   // Should be saved
   public string FirstName {...} 
   // Should be saved
   public string SecondName {...} 
   // Should NOT be saved
   public string Name {get {return $"{FirstName} {SecondName}";}}
您可以详细说明应保存哪些数据的标准,例如,如果是
FirstName
,您可能需要检查(至少!)

这就是我建议在类中实现自定义属性/方法的原因:

   public class MyClass {
     ...
     // virtual: you may want to add some properties in a derived class 
     public virtual bool IsEmpty {
       get {
         return string.IsNullOrWhiteSpace(FirstName) &&
                string.IsNullOrWhiteSpace(SecondName) &&
                ...
       }
     } 
   }

从技术上讲,您可以将反射和Linq组合成如下内容:

  Object obj = ...

  // All Empty (false or null) public properties of either string or bool type
  PropertyInfo[] emptyProps = obj
    .GetType()
    .GetProperties(BindingFlags.Instance | BindingFlags.Public)
    .Where(prop => prop.CanRead) // you may want to check prop.CanWrite as well
    .Where(prop => prop.PropertyType == typeof(bool) || 
                   prop.PropertyType == typeof(string))
    .Where(prop => object.Equals(prop.GetValue(obj), 
                                 prop.PropertyType.IsValueType 
                                   ? Activator.CreateInstance(prop.PropertyType) 
                                   : null))
    .ToArray();
但是,我怀疑您是否应该这样做:某些属性不应保存:

   // Should be saved
   public string FirstName {...} 
   // Should be saved
   public string SecondName {...} 
   // Should NOT be saved
   public string Name {get {return $"{FirstName} {SecondName}";}}
您可以详细说明应保存哪些数据的标准,例如,如果是
FirstName
,您可能需要检查(至少!)

这就是我建议在类中实现自定义属性/方法的原因:

   public class MyClass {
     ...
     // virtual: you may want to add some properties in a derived class 
     public virtual bool IsEmpty {
       get {
         return string.IsNullOrWhiteSpace(FirstName) &&
                string.IsNullOrWhiteSpace(SecondName) &&
                ...
       }
     } 
   }

但是“false”也是一个有效值吗?“<代码> BoL?<代码>会更好吗?为什么不存储用户所使用的“步骤”?约翰:我认为这是一个非常好的建议,以便我们可以将真/假都当作非空的来处理。同意。我愿意做出改变。谢谢。@Sweeper:由于应用程序的结构原因,我不能。我必须使用数据来识别它。使用可为空的变量。Null表示空白。您可以有空布尔值,但“false”也是有效值吗?“<代码> BoL?<代码>会更好吗?为什么不存储用户所使用的“步骤”?约翰:我认为这是一个非常好的建议,以便我们可以将真/假都当作非空的来处理。同意。我愿意做出改变。谢谢。@Sweeper:由于应用程序的结构原因,我不能。我必须使用数据来识别它。使用可为空的变量。Null表示空白。对于字符串,只需使用
String.IsNullOrEmpty(您的\u字符串)
。对于字符串,只需使用
String.IsNullOrEmpty(您的\u字符串)