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可以减少开发时间和减少代码重复,因此可以忽略一点性能开销。
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(更改值)。
- 2 回答
- 0 关注
- 185 浏览
添加回答
举报