我有多个属性的类;
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(更改值(。