Как проверить все свойства объекта, будь то null или empty?
У меня есть объект, который позволяет называть его ObjectA
и этот объект имеет 10 свойств, и все они являются строками.
var myObject = new {Property1="",Property2="",Property3="",Property4="",...}
так или иначе, чтобы проверить, являются ли все эти свойства пустыми или пустыми?
Итак, любой встроенный метод, который вернет true или false?
Если какой-либо из них не является нулевым или пустым, то возврат будет ложным. Если все они пусты, он должен вернуть true.
Идея заключается в том, что я не хочу писать оператор 10 if для управления, если эти свойства пустые или нулевые.
Спасибо
Ответы
Ответ 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);