С# анонимный цикл foreach

Мне нужно пройтись по свойствам пользовательского типа объекта, который я получаю из базы данных, и показать только те столбцы, которые содержат данные. Это означает, что я не могу просто привязать список объектов к сетке данных. Я не хочу перебирать каждый объект и смотреть, является ли столбец пустым/нулевым, и определять в пользовательском интерфейсе его отображение. То, что я думаю, находится на моем бизнес-уровне, прежде чем я отправлю объект обратно, я бы отправил IEnumerable обратно только с теми столбцами, которые должны быть видны. Таким образом, я думал об использовании Linq to Object для этого, но я не уверен, что это было бы очень красиво.

Кто-нибудь знает решение, которое я мог бы использовать без тонны операторов IF, которые я мог бы сделать, чтобы проверить большой объект (примерно 30 столбцов), чтобы определить, что следует показывать или нет.

Foreach (CustomerData customerdata in Customers) 
{ 
    if (!customerdata.address.Equals("")) 
       {
            dgvCustomerData.Column["Address"].visible = false;
         }
        //Continue checking other data columns...
}

Я хочу избежать всего этого в пользовательском интерфейсе и всех IF... У меня пукают мозги по этому поводу, кто-нибудь может мне помочь?

Спасибо


person Bob    schedule 10.12.2009    source источник


Ответы (2)


Ознакомьтесь с библиотеками отражения .NET. . Вы можете использовать отражение, чтобы получить все свойства объекта и просмотреть их, чтобы узнать, являются ли они нулевыми или нет. Затем вы можете вернуть коллекцию объектов KeyValuePair, где Key = имя свойства, а Value = true/false. Затем вы должны использовать пары ключ-значение для установки видимости столбца...

person echo    schedule 10.12.2009
comment
Это было скорее решение, о котором я думал, но вместо хеш-таблицы я больше думал о списке IEnumerable, который затем можно было бы просто привязать к сетке данных. Я буду исследовать это немного больше. - person Bob; 10.12.2009

Вы можете сделать следующее, чтобы немного упростить его

Action<T,string> del = (value,name) => {
  if ( value.Equals("") ) {
    dgvCustomerData.Column[name].Visible = false;
  }
};
foreach ( var data in Customers ) {
  del(data.address,"Address");
  del(data.name, "Name");
  ...
}
person JaredPar    schedule 10.12.2009
comment
Я хотел бы вытащить это из слоя пользовательского интерфейса, чтобы пользовательскому интерфейсу не приходилось решать, что показывать, а что нет. Тем не менее, это был подход, о котором я думал в первую очередь. - person Bob; 10.12.2009