猿问

检查Object是否在每个属性中都为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';

其余值为null。还行吧


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


喜欢string.IsNullOrEmpty()对象吗?


我现在正在检查


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



森栏
浏览 186回答 2
2回答

千万里不及你

编辑该答案在上一次获得了一些投票,因此我决定对其进行一些改进,添加简单的缓存,这样ArePropertiesNotNull就不会在每次调用该属性时都检索该属性,而对于每种类型仅检索一次。public static class PropertyCache<T>{&nbsp; &nbsp; private static readonly Lazy<IReadOnlyCollection<PropertyInfo>> publicPropertiesLazy&nbsp; &nbsp; &nbsp; &nbsp; = new Lazy<IReadOnlyCollection<PropertyInfo>>(() => typeof(T).GetProperties());&nbsp; &nbsp; public static IReadOnlyCollection<PropertyInfo> PublicProperties => PropertyCache<T>.publicPropertiesLazy.Value;}public static class Extensions{&nbsp; &nbsp; public static bool ArePropertiesNotNull<T>(this T obj)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return PropertyCache<T>.PublicProperties.All(propertyInfo => propertyInfo.GetValue(obj) != null);&nbsp; &nbsp; }}(下面的旧答案。)您可以使用Joel Harkes提出的反射,例如,我将这种可重用的,随时可用的扩展方法放在一起public static bool ArePropertiesNotNull<T>(this T obj){&nbsp; &nbsp; return typeof(T).GetProperties().All(propertyInfo => propertyInfo.GetValue(obj) != null);&nbsp; &nbsp;&nbsp;}然后可以这样称呼它var employee = new Employee();bool areAllPropertiesNotNull = employee.ArePropertiesNotNull();现在,您可以检查areAllPropertiesNotNull 指示所有属性是否都不为null的标志。true如果所有属性都不为null,则返回,否则返回false。这种方法的优点对于检查,属性类型是否可为空无关紧要。由于上述方法是通用的,因此可以将其用于所需的任何类型,而不必为每种要检查的类型编写样板代码。如果以后再更改班级,它将更具前瞻性。(ispiro注意到)。缺点反射可能会非常慢,在这种情况下,它肯定比您当前编写显式代码要慢。使用简单的缓存(如Reginald Blue所建议的那样,将消除很多开销。在我看来,由于使用ArePropertiesNotNullYMMV可以减少开发时间和减少代码重复,因此可以忽略一点性能开销。

饮歌长啸

您可以通过写下代码来手动检查每个属性来实现此目的(最佳选择),或者使用反射(在此处了解更多信息)Employee emp = new Employee();var props = emp.GetType().GetProperties())foreach(var prop in props)&nbsp;{&nbsp; &nbsp;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(更改值)。
随时随地看视频慕课网APP
我要回答