¿Cómo verificar todas las propiedades de un objeto ya sea nulo o vacío?

Tengo un objeto, vamos a llamarlo ObjectA

y ese objeto tiene 10 propiedades y todas son cadenas.

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

¿Hay alguna manera de verificar si todas estas propiedades son nulas o están vacías?

Entonces, ¿algún método incorporado que devuelva verdadero o falso?

Si alguno de ellos no es nulo o está vacío, la devolución sería falsa. Si todos están vacíos, debería volverse verdadero.

La idea es que no quiero escribir 10 if statement para controlar si esas propiedades están vacías o nulas.

Gracias

Puedes hacerlo usando 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 Watson sugirió una alternativa usando LINQ:

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

Supongo que quiere asegurarse de que todas las propiedades estén completas.

Una mejor opción es probablemente colocar esta validación en el constructor de su clase y lanzar excepciones si la validación falla. De esta forma no puedes crear una clase que no sea válida; detectar excepciones y manejarlas en consecuencia.

La validación fluida es un marco agradable ( http://fluentvalidation.codeplex.com ) para realizar la validación. Ejemplo:

 public class CustomerValidator: AbstractValidator { 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;} } 

Uso:

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

PD: Usar la reflexión para este tipo de cosas hace que el código sea más difícil de leer. El uso de la validación como se muestra arriba hace que quede explícitamente claro cuáles son sus reglas; y puedes extenderlos fácilmente con otras reglas.

Aqui tienes

 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))); 

y aquí está la clase

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

Una forma ligeramente diferente de express el linq para ver si todas las propiedades de cadena de un objeto no son nulas y no están vacías:

 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)); } 

puede usar métodos de reflexión y extensión para hacer esto.

 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; } } 

luego utilícelo en cualquier objeto con propiedades de cadena

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

El siguiente código retorna si alguna propiedad no es nula.

  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. 

Tenga en cuenta que si tiene una jerarquía estructural de datos y desea probar todo en esa jerarquía, entonces puede usar un método recursivo. Aquí hay un ejemplo rápido:

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

No, no creo que haya un método para hacer exactamente eso.

Sería mejor escribir un método simple que tome su objeto y devuelva verdadero o falso.

Alternativamente, si las propiedades son todas iguales, y solo quiere analizarlas y encontrar un solo nulo o vacío, quizás algún tipo de colección de cadenas funcionaría para usted.