2009-02-06 3 views
4

У нас есть сценарий, в котором, если сущность существует между источником и целью, мы должны объединить данные в целевую, то есть скопировать значения из колонок фонда, где целевой столбец пуст.Поиск пустых полей в объекте - C#

Мы используем вызовы службы WCF, и у нас есть объекты сущности.

Если у меня есть сущность позволяет сказать Staff, персонал conatins основных свойств для имени и т.д., и у нас есть список для StaffAddress, StaffEmail и StaffPhone.

Так что я просто хотел знать, есть ли способ использовать LINQ или какой-либо другой механизм - я могу узнать список свойств на объекте Staff, которые являются пустыми или пустыми?

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

ответ

1

Вот быстрый и грязный способ сделать это с помощью LINQ

public static IEnumerable<string> FindBlankFields(Staff staff) 
{ 
    return staff.GetType() 
     .GetProperties(BindingFlags.Instance | BindingFlags.Public | 
      BindingFlags.NonPublic) 
     .Where(p => p.CanRead) 
     .Select(p => new { Property = p, Value = p.GetValue(staff, null) }) 
     .Where(a => a.Value == null || String.IsNullOrEmpty(a.Value.ToString())) 
     .Select(a => a.Property.Name); 
} 
5

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

static IEnumerable<PropertyInfo> GetNullProperties(object obj) 
{ 
    // Get the properties and return only the ones where GetValue 
    // does not return null. 
    return 
    from pi in obj.GetType().GetProperties(
     BindingFlags.Instance | BindingFlags.Public) 
    where pi.GetValue(obj, null) != null 
    select pi; 
} 

Имейте в виду, это будет возвращать только открытые свойства на тип, не непубличные свойства.

+0

Кроме того, я не считаю, что это скажет вам, если строка пуста. Но это можно легко изменить, чтобы сделать это. – BobbyShaftoe

+0

Красивая, я люблю крутой LINQ +1 – bendewey

+0

Нет необходимости указывать BindingFlags.Instance | BindingFlags.Public здесь. Это значение по умолчанию. –

0

Вы должны были бы использовать некоторые отражения для этого:

var unsetProperties = from prop in foo.GetType().GetProperties() 
      let value = prop.GetValue(foo, null) 
      where value == null || value.Equals(string.Empty) 
      select prop.Name; 
+0

К сожалению, это также получит статические свойства, которые я не думаю, что плакат хочет. – casperOne

Смежные вопросы