检查对象是否在每个属性中都具有 null



我有多个属性的类;

public class Employee
{
public string TYPE { get; set; }
public int? SOURCE_ID { get; set; }
public string FIRST_NAME { get; set; }        
public string LAST_NAME { get; set; }
public List<Department> departmentList { get; set; }
public List<Address> addressList { get; set; }
}

有时这个对象会向我返回任何属性中的值,例如

Employee emp = new Employee();
emp.FIRST_NAME= 'abc';

其余值为空。这没关系

但是,当对象属性中的所有都为空时,如何检查

喜欢对象string.IsNullOrEmpty()

我正在这样检查;

if(emp.FIRST_NAME == null && emp.LAST_NAME == null && emp.TYPE == null && emp.departmentList == null ...)

编辑

这个答案在上次收到了一些投票,所以我决定稍微改进一下,添加简单的缓存,这样ArePropertiesNotNull就不会在每次调用时检索属性,而是对每种类型只检索一次。

public static class PropertyCache<T>
{
private static readonly Lazy<IReadOnlyCollection<PropertyInfo>> publicPropertiesLazy
= new Lazy<IReadOnlyCollection<PropertyInfo>>(() => typeof(T).GetProperties());
public static IReadOnlyCollection<PropertyInfo> PublicProperties => PropertyCache<T>.publicPropertiesLazy.Value;
}
public static class Extensions
{
public static bool ArePropertiesNotNull<T>(this T obj)
{
return PropertyCache<T>.PublicProperties.All(propertyInfo => propertyInfo.GetValue(obj) != null);
}
}

(下面的旧答案。


你可以按照Joel Harkes的建议使用反射,例如,我把这个可重用的、即用型的扩展方法放在一起

public static bool ArePropertiesNotNull<T>(this T obj)
{
return typeof(T).GetProperties().All(propertyInfo => propertyInfo.GetValue(obj) != null);    
}

然后可以这样称呼

var employee = new Employee();
bool areAllPropertiesNotNull = employee.ArePropertiesNotNull();

现在,您可以检查指示所有属性是否为空的areAllPropertiesNotNull标志。如果所有属性都不为 null,则返回true,否则返回false


这种方法的优点

对于
  • 检查,属性类型是否可为空并不重要。
  • 由于上述方法是通用的,因此您可以将其用于所需的任何类型,而不必为要检查的每种类型编写样板代码。
  • 如果您
  • 以后更改类,它更面向未来。(伊斯皮罗指出(。

  • 反射可能非常慢,在这种情况下,它肯定比像您当前那样编写显式代码要慢。 使用简单的缓存(如Reginald Blue所建议的那样(将消除大部分开销。

在我看来,轻微的性能开销可以忽略不计,因为在使用ArePropertiesNotNull时减少了开发时间和代码重复,但 YMMV。

要么通过写下代码来手动检查每个属性(最佳选项(,要么使用反射(在此处阅读更多内容(

Employee emp = new Employee();
var props = emp.GetType().GetProperties())
foreach(var prop in props) 
{
if(prop.GetValue(foo, null) != null) return false;
}
return true;

这里的例子

请注意,int 不能为 null!,其默认值将为 0。 因此检查prop == default(int)比检查== null更好

选项 3

另一种选择是实现 INotifyPropertyChanged。

在更改集上,布尔字段值isDirty为 true,您只需检查此值是否为 true 即可知道是否设置了任何属性(即使属性设置为 null。

警告:此方法的每个属性仍然可以为 null,但只检查是否调用了 setter(更改值(。

相关内容

  • 没有找到相关文章

最新更新