Como verificar todas as propriedades de um object, seja nulo ou vazio?

Eu tenho um object, vamos chamá-lo de ObjectA

e esse object tem 10 propriedades e essas são todas as strings.

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

existe de qualquer maneira para verificar se todas essas propriedades são nulas ou vazias?

Então, qualquer método embutido que retornaria verdadeiro ou falso?

Se algum deles não for nulo ou vazio, o retorno será falso. Se todos estiverem vazios, deve retornar true.

A idéia é que eu não quero escrever 10 se declaração para controlar se essas propriedades estão vazias ou nulas.

obrigado

Você pode fazer isso usando Reflexão

 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 sugeriu uma alternativa usando o LINQ:

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

Eu suponho que você quer ter certeza de que todas as propriedades estão preenchidas.

Uma opção melhor é provavelmente colocar essa validação no construtor da sua class e lançar exceções se a validação falhar. Dessa forma, você não pode criar uma class que seja inválida; pegar exceções e lidar com elas de acordo.

A validação fluente é uma boa estrutura ( http://fluentvalidation.codeplex.com ) para fazer a validação. Exemplo:

 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 } 

PS – Usando a reflection para esse tipo de coisa só faz seu código mais difícil de ler. Usando a validação, conforme mostrado acima, fica explicitamente claro quais são suas regras; e você pode facilmente estendê-las com outras regras.

Aqui está

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

e aqui está a aula

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

Uma maneira ligeiramente diferente de expressar o linq para ver se todas as propriedades da cadeia de caracteres de um object são não nulas e não vazias:

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

você pode usar methods de reflection e extensão para fazer isso.

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

então use-o em qualquer object com propriedades de string

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

O código a seguir retorna se qualquer propriedade não for 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. 

Observe que, se você tiver uma hierarquia estrutural de dados e quiser testar tudo nessa hierarquia, poderá usar um método recursivo. Aqui está um exemplo rápido:

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

Não, não acho que exista um método para fazer exatamente isso.

Você seria melhor escrever um método simples que leva seu object e retorna verdadeiro ou falso.

Alternativamente, se as propriedades são todas iguais, e você só quer analisá-las e encontrar um único nulo ou vazio, talvez algum tipo de coleção de strings funcione para você?