Проверка, имеет ли объект значение NULL в каждом свойстве - PullRequest
0 голосов
/ 02 мая 2018

У меня есть класс с несколькими свойствами;

public class Employee
{
    public string TYPE { get; set; }
    public int? SOURCE_ID { get; set; }
    public string FIRST_NAME { get; set; }        
    public string LAST_NAME { get; set; }

    public List<Department> departmentList { get; set; }
    public List<Address> addressList { get; set; }

}

иногда этот объект возвращает мне значение в любом свойстве, скажем

Employee emp = new Employee();
emp.FIRST_NAME= 'abc';

остальные значения равны нулю. Это нормально

Но, как проверить, когда все значения в свойствах объектов равны нулю

как string.IsNullOrEmpty() для объекта?

, конечно, я проверяю вот так;

if(emp.FIRST_NAME == null && emp.LAST_NAME == null && emp.TYPE == null && emp.departmentList == null ...)

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Вы можете использовать отражение как предложено Джоэл Харкс , например. Я собрал этот многоразовый, готовый к использованию метод расширения

public static bool ArePropertiesNotNull<T>(this T obj)
{
    return typeof(T).GetProperties().All(propertyInfo => propertyInfo.GetValue(obj) != null);    
}

, который затем можно так назвать

var employee = new Employee();
bool areAllPropertiesNotNull = employee.ArePropertiesNotNull();

И теперь вы можете проверить флаг areAllPropertiesNotNull, который указывает, что все свойства не равны NULL. Возвращает true, если все свойства не равны NULL, в противном случае false.


Преимущества такого подхода

  • Не имеет значения, является ли тип свойства обнуляемым или нет для чека.
  • Поскольку вышеуказанный метод является общим, вы можете использовать его для любого типа, который вам нужен, и вам не нужно писать шаблонный код для каждого типа, который вы хотите проверить.
  • В будущем вы смените класс на будущее. (отмечено испиро ).

Недостатки

  • Отражение может быть довольно медленным, и в этом случае оно, безусловно, медленнее, чем написание явного кода, как вы делаете сейчас. Использование простого кэширования (как предложено Reginald Blue удалит большую часть этих издержек.

На мой взгляд, небольшим снижением производительности можно пренебречь, поскольку время разработки и повторение кода сокращаются при использовании ArePropertiesNotNull, но YMMV.

0 голосов
/ 02 мая 2018

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

Employee emp = new Employee();
var props = emp.GetType().GetProperties())
foreach(var prop in props) 
{
   if(prop.GetValue(foo, null) != null) return false;
}
return true;

пример из здесь

Обратите внимание, что int не может быть нулевым! и его значение по умолчанию будет равно 0. Таким образом, лучше проверить prop == default(int), чем == null

вариант 3

Другим вариантом является реализация INotifyPropertyChanged .

При изменении установите значение логического поля isDirty равным true, а затем вам нужно только проверить, является ли это значение истинным, чтобы узнать, было ли установлено какое-либо свойство (даже если свойство было установлено с нулем.

Предупреждение: этот метод, каждое свойство может все еще быть нулевым, но только проверяет, был ли вызван метод установки (изменение значения).

...