如何检查空对象?
How to check an empty object?
我有很多对象。其中一些具有字符串属性,其中一些具有布尔属性。我以多步骤形式使用它们。所以每个步骤都绑定到每个对象。
现在,如果用户填写前两部分并保存数据,因为用户希望稍后填写其余数据。此时,我需要确定填充了多少数据,还剩下多少数据。以便下次加载表单时,根据之前填写的数据,我可以确定从哪里开始填写表单。
我试图在保存时确定有多少对象具有值。换句话说,如果我找到一个包含所有值的对象,例如空字符串,我可以跳过要保存到数据库中的对象。我提到了这个 ,它展示了如何检查具有所有字符串属性的空对象。
如何在此检查中也包含布尔属性?例如如果对象有 10 个 bool 属性,并且所有属性都是假的,我需要将该对象标识为空。
所以总结一下上面的问题,如何识别对象是否为空白,具有 bool 或 string 属性?
你可以简单的检查一下:
obj == null || obj == String.Empty
这将检查 null
和“空”条件。
从技术上讲,您可以将 Reflection 和 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
,您可能需要检查(至少!)
// 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;
我有很多对象。其中一些具有字符串属性,其中一些具有布尔属性。我以多步骤形式使用它们。所以每个步骤都绑定到每个对象。
现在,如果用户填写前两部分并保存数据,因为用户希望稍后填写其余数据。此时,我需要确定填充了多少数据,还剩下多少数据。以便下次加载表单时,根据之前填写的数据,我可以确定从哪里开始填写表单。
我试图在保存时确定有多少对象具有值。换句话说,如果我找到一个包含所有值的对象,例如空字符串,我可以跳过要保存到数据库中的对象。我提到了这个 ,它展示了如何检查具有所有字符串属性的空对象。
如何在此检查中也包含布尔属性?例如如果对象有 10 个 bool 属性,并且所有属性都是假的,我需要将该对象标识为空。
所以总结一下上面的问题,如何识别对象是否为空白,具有 bool 或 string 属性?
你可以简单的检查一下:
obj == null || obj == String.Empty
这将检查 null
和“空”条件。
从技术上讲,您可以将 Reflection 和 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
,您可能需要检查(至少!)
// 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;