Подтвердить что ты не робот

Как проверить все свойства объекта, будь то null или empty?

У меня есть объект, который позволяет называть его ObjectA

и этот объект имеет 10 свойств, и все они являются строками.

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

так или иначе, чтобы проверить, являются ли все эти свойства пустыми или пустыми?

Итак, любой встроенный метод, который вернет true или false?

Если какой-либо из них не является нулевым или пустым, то возврат будет ложным. Если все они пусты, он должен вернуть true.

Идея заключается в том, что я не хочу писать оператор 10 if для управления, если эти свойства пустые или нулевые.

Спасибо

4b9b3361

Ответ 1

Вы можете сделать это с помощью 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;
}

Мэтью Уотсон предложил альтернативу, используя LINQ:

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

Ответ 2

Я предполагаю, что вы хотите, чтобы все свойства были заполнены.

Лучшим вариантом является, вероятно, включение этой проверки в конструктор вашего класса и исключение исключений, если проверка не выполняется. Таким образом, вы не можете создать недопустимый класс; перехватывать исключения и обрабатывать их соответственно.

Свободная проверка является хорошей структурой (http://fluentvalidation.codeplex.com) для выполнения проверки. Пример:

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 - Использование отражения для такого рода вещей просто делает ваш код более трудным для чтения. Использование валидации, как показано выше, явно указывает на то, что ваши правила; и вы можете легко расширить их с помощью других правил.

Ответ 3

Здесь вы идете

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 ObjectA
{
    public string A { get; set; }
    public string B { get; set; }
}

Ответ 4

Несколько иной способ выражения linq, чтобы увидеть, не являются ли все строковые свойства объекта не пустыми и не пустыми:

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

Ответ 5

вы можете использовать методы отражения и расширения для этого.

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

затем используйте его на любом объекте со строковыми свойствами

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

Ответ 6

Обратите внимание, если у вас есть структурная иерархия данных, и вы хотите протестировать все в этой иерархии, тогда вы можете использовать рекурсивный метод. Вот краткий пример:

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

Ответ 7

Следующий код возвращает, если какое-либо свойство не равно 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.

Ответ 8

Нет, я не думаю, что есть способ сделать именно это.

Лучше всего написать простой метод, который берет ваш объект и возвращает true или false.

В качестве альтернативы, если свойства все одинаковы, и вы просто хотите проанализировать их и найти один пустой или пустой, возможно, какая-то коллекция строк будет работать для вас?

Ответ 9

Чтобы только проверить, являются ли все свойства нулевыми:

bool allPropertiesNull = !myObject.GetType().GetProperties().Any(prop => prop == null);