如何检查对象的所有属性是否为空或空?

我有一个对象让我们称之为ObjectA

该对象有10个属性,这些都是string。

  var myObject = new {Property1="",Property2="",Property3="",Property4="",...} 

有无论如何检查,看所有这些属性是空的还是空的?

那么任何内置的方法将返回true或false?

如果它们中的任何一个不为空或空,则返回将是错误的。 如果他们都是空的,它应该返回true。

这个想法是我不想写10语句来控制如果这些属性是空的或空的。

谢谢

你可以使用reflection来做到这一点

 bool IsAnyNullOrEmpty(object myObject) { foreach(PropertyInfo pi in myObject.GetType().GetProperties()) { if(pi.PropertyType == typeof(string)) { string value = (string)pi.GetValue(myObject); if(string.IsNullOrEmpty(value)) { return true; } } } return false; } 

Matthew Watsonbuild议使用LINQ的替代scheme:

 return myObject.GetType().GetProperties() .Where(pi => pi.GetValue(myObject) is string) .Select(pi => (string) pi.GetValue(myObject)) .Any(value => String.IsNullOrEmpty(value)); 

干得好

 var instOfA = new ObjectA(); bool isAnyPropEmpty = instOfA.GetType().GetProperties() .Where(p => p.GetValue(instOfA) is string) // selecting only string props .Any(p => string.IsNullOrWhiteSpace((p.GetValue(instOfA) as string))); 

这是class级

 class ObjectA { public string A { get; set; } public string B { get; set; } } 

我想你想确保所有的属性都被填入。

一个更好的select可能是把这个validation放到你的类的构造函数中,如果validation失败,则抛出exception。 这样你就不能创build一个无效的类; 捕获exception并相应地处理它们。

stream利的validation是一个很好的框架( http://fluentvalidation.codeplex.com )进行validation。 例:

 public class CustomerValidator: AbstractValidator<Customer> { public CustomerValidator() { RuleFor(customer => customer.Property1).NotNull(); RuleFor(customer => customer.Property2).NotNull(); RuleFor(customer => customer.Property3).NotNull(); } } public class Customer { public Customer(string property1, string property2, string property3) { Property1 = property1; Property2 = property2; Property3 = property3; new CustomerValidator().ValidateAndThrow(); } public string Property1 {get; set;} public string Property2 {get; set;} public string Property3 {get; set;} } 

用法:

  try { var customer = new Customer("string1", "string", null); // logic here } catch (ValidationException ex) { // A validation error occured } 

PS – 使用reflection这种事情只是让你的代码难以阅读。 使用如上所示的validation,可以明确地清楚你的规则是什么; 而且你可以很容易地用其他规则来扩展它们。

expressionlinq的稍微不同的方式来查看对象的所有string属性是否为非null和非空:

 public static bool AllStringPropertyValuesAreNonEmpty(object myObject) { var allStringPropertyValues = from property in myObject.GetType().GetProperties() where property.PropertyType == typeof(string) && property.CanRead select (string) property.GetValue(myObject); return allStringPropertyValues.All(value => !string.IsNullOrEmpty(value)); } 

你可以使用reflection和扩展方法来做到这一点。

 using System.Reflection; public static class ExtensionMethods { public static bool StringPropertiesEmpty(this object value) { foreach (PropertyInfo objProp in value.GetType().GetProperties()) { if (objProp.CanRead) { object val = objProp.GetValue(value, null); if (val.GetType() == typeof(string)) { if (val == "" || val == null) { return true; } } } } return false; } } 

然后在具有string属性的任何对象上使用它

 test obj = new test(); if (obj.StringPropertiesEmpty() == true) { // some of these string properties are empty or null } 

注意,如果你有一个数据结构层次结构,并且你想testing该层次结构中的所有内容,那么你可以使用recursion方法。 这里有一个简单的例子:

 static bool AnyNullOrEmpty(object obj) { return obj == null || obj.ToString() == "" || obj.GetType().GetProperties().Any(prop => AnyNullOrEmpty(prop.GetValue(obj))); } 

不,我不认为有一种方法可以做到这一点。

你最好写一个简单的方法,把你的对象,并返回true或false。

或者,如果这些属性都是相同的,而你只是想通过它们来parsing并find一个null或空的,也许某种types的string集合可以为你工作?

如果任何属性不为null,则返回以下代码。

  return myObject.GetType() .GetProperties() //get all properties on object .Select(pi => pi.GetValue(myObject)) //get value for the propery .Any(value => value != null); // Check if one of the values is not null, if so it returns true.