Отражение (?) - Проверить на нулевое или пустое значение для каждого свойства / поля в классе? - PullRequest
19 голосов
/ 02 августа 2011

У меня есть простой класс как таковой:

public class FilterParams
{
    public string MeetingId { get; set; }
    public int? ClientId { get; set; }
    public string CustNum { get; set; }
    public int AttendedAsFavor { get; set; }
    public int Rating { get; set; }
    public string Comments { get; set; }
    public int Delete { get; set; }
}

Как проверить для каждого свойства в классе, если они не нулевые (int) или пустые / нулевые (для строки), тогда я преобразую и добавлю значение этого свойства в List<string>?

Спасибо.

Ответы [ 6 ]

31 голосов
/ 02 августа 2011

Вы можете использовать LINQ для этого:

List<string> values
    = typeof(FilterParams).GetProperties()
                          .Select(prop => prop.GetValue(yourObject, null))
                          .Where(val => val != null)
                          .Select(val => val.ToString())
                          .Where(str => str.Length > 0)
                          .ToList();
6 голосов
/ 02 августа 2011

Не самый лучший подход, но примерно:

Предположим, obj является экземпляром вашего класса:

Type type = typeof(FilterParams);


foreach(PropertyInfo pi in type.GetProperties())
{
  object value = pi.GetValue(obj, null);

  if(value != null && !string.IsNullOrEmpty(value.ToString()))
     // do something
}
2 голосов
/ 02 августа 2011

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

public class FilterParams
{
    // ...

    public IEnumerable<string> GetValues()
    {
        if (MeetingId != null) yield return MeetingId;
        if (ClientId.HasValue) yield return ClientId.Value.ToString();
        // ...
        if (Rating != 0)       yield return Rating.ToString();
        // ...
    }
}

Использование:

FilterParams filterParams = ...

List<string> values = filterParams.GetValues().ToList();
1 голос
/ 02 августа 2011
PropertyInfo[] properties = typeof(FilterParams).GetProperties();
foreach(PropertyInfo property in properties)
{
    object value = property.GetValue(SomeFilterParamsInstance, null);
    // preform checks on value and etc. here..
}
0 голосов
/ 02 августа 2011

Вам действительно нужно отражение? Реализация свойства как bool IsNull это дело для вас? Вы можете инкапсулировать его в интерфейс, такой как INullableEntity, и реализовать в каждом классе, который нуждается в такой функциональности, очевидно, если есть много классов, возможно, вам придется придерживаться отражения.

0 голосов
/ 02 августа 2011

Вот пример:

foreach (PropertyInfo item in typeof(FilterParams).GetProperties()) {
    if (item != null && !String.IsNullOrEmpty(item.ToString()) {
        //add to list, etc
     } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...