为了账号安全,请及时绑定邮箱和手机立即绑定

检查Object是否在每个属性中都为null

检查Object是否在每个属性中都为null

C#
森栏 2021-05-18 17:50:07
我有多个属性的课程;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 ...)
查看完整描述

2 回答

?
千万里不及你

TA贡献1784条经验 获得超9个赞

编辑

该答案在上一次获得了一些投票,因此我决定对其进行一些改进,添加简单的缓存,这样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如果所有属性都不为null,则返回,否则返回false。


这种方法的优点

对于检查,属性类型是否可为空无关紧要。

由于上述方法是通用的,因此可以将其用于所需的任何类型,而不必为每种要检查的类型编写样板代码。

如果以后再更改班级,它将更具前瞻性。(ispiro注意到)。

缺点

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

在我看来,由于使用ArePropertiesNotNullYMMV可以减少开发时间和减少代码重复,因此可以忽略一点性能开销。


查看完整回答
反对 回复 2021-05-23
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

您可以通过写下代码来手动检查每个属性来实现此目的(最佳选择),或者使用反射(在此处了解更多信息)


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(更改值)。


查看完整回答
反对 回复 2021-05-23
  • 2 回答
  • 0 关注
  • 185 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信