如何检查空对象?

How to check an empty object?

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

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

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

如何在此检查中也包含布尔属性?例如如果对象有 10 个 bool 属性,并且所有属性都是假的,我需要将该对象标识为空。

所以总结一下上面的问题,如何识别对象是否为空白,具有 bool 或 string 属性?

你可以简单的检查一下:

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

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

从技术上讲,您可以将 ReflectionLinq 组合成这样:

  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,您可能需要检查(至少!)

   // FirstName must be not null, not empty and not blank
   bool shouldSave = !string.IsNullOrWhiteSpace(FirstName);

这就是为什么我建议在 class:

中实施 自定义 属性 / 方法
   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) &&
                ...
       }
     } 
   }

您可以将其序列化为 json 然后针对字符串进行测试以实现类似的检查:

public static object? NullIfEmptyValues(object obj) =>
    JsonSerializer.Serialize(obj) is "\"\"" or "[]" or "null" ? null : obj;