How to check all properties of an object whether null or empty?

后端 未结 9 1216
星月不相逢
星月不相逢 2020-11-28 06:41

I have an object lets call it ObjectA

and that object has 10 properties and those are all strings.

 var myObject = new {Property1=\"\",P         


        
相关标签:
9条回答
  • 2020-11-28 07:14

    I suppose you want to make sure that all properties are filled in.

    A better option is probably by putting this validation in the constructor of your class and throw exceptions if validation fails. That way you cannot create a class that is invalid; catch exceptions and handle them accordingly.

    Fluent validation is a nice framework (http://fluentvalidation.codeplex.com) for doing the validation. Example:

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

    Usage:

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

    PS - Using reflection for this kind of thing just makes your code harder to read. Using validation as shown above makes it explicitly clear what your rules are; and you can easily extend them with other rules.

    0 讨论(0)
  • 2020-11-28 07:14

    Note if you've got a data structural hierarchy and you want to test everything in that hierarchy, then you can use a recursive method. Here's a quick example:

    static bool AnyNullOrEmpty(object obj) {
      return obj == null
          || obj.ToString() == ""
          || obj.GetType().GetProperties().Any(prop => AnyNullOrEmpty(prop.GetValue(obj)));
    }
    
    0 讨论(0)
  • 2020-11-28 07:15

    You can do it using 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 suggested an alternative using LINQ:

    return myObject.GetType().GetProperties()
        .Where(pi => pi.PropertyType == typeof(string))
        .Select(pi => (string)pi.GetValue(myObject))
        .Any(value => string.IsNullOrEmpty(value));
    
    0 讨论(0)
提交回复
热议问题