Хотя я согласен с тем, что ответ Андрея удобен, он определенно может повлиять на производительность.Если ваши данные плоские (и это так, поскольку вы в конечном итоге извлекаете данные из базы данных), то у вас может быть IEnumerable<IDictionary<string, object>>
, где каждая строка в IEnumerable<T>
равна IDictionary<string, object>
содержит значения из строки.
Это более громоздко для начала, но является динамическим;добавление или удаление атрибутов из результирующего набора будет по-прежнему работать.
Это также более производительно, так как у вас не будет (1,000 to 10,000) * N
вызовов для отражения (от 1000 до 10000) строк, раз N
,количество атрибутов в каждой строке (если у вас есть 100 атрибутов в строке, то это 100 000 - 1 000 000 вызовов Reflection, которые будут суммироваться).В конечном итоге DynamicDictionary
сохраняет пары ключ / значение в справочной таблице, но для доступа к справочной таблице используется Reflection (оптимизированная с помощью DLR, но все еще в ее основе).
И вы знаете что это за свойства (вы сказали, что используете его для своего проекта, поэтому у вас есть , чтобы узнать, какие свойства вы хотите использовать).Для этого вы действительно должны использовать строго типизированный объект передачи данных со всеми свойствами, которые могут иметь значение null, которые представляют значения из базы данных;все, что является нулевым или не существует в наборе результатов, устанавливается равным нулю.Значения, которые не существуют в результирующем наборе, никогда не устанавливаются.
Таким образом, у вас нет Reflection, вы получаете проверку типов во время компиляции (что очень важно, используя DynamicObject
приведет к исключениям времени выполнения) и лучшей производительности.
Сериализация в XML или JSON проста с любым из этих подходов, вы просто сериализуете нулевые значения или не сериализуете свойство вообще (еслииспользуя XML, просто убедитесь, что ваша схема поддерживает элементы в качестве параметров).