Как определить, все ли объекты сериализуемы в данном пространстве имен? - PullRequest
3 голосов
/ 15 июля 2010

Немного предыстории: мы требуем, чтобы все наши объекты DTO были сериализуемыми, чтобы они могли храниться в сеансе или кэшироваться.

Как вы можете себе представить, это чрезвычайно раздражает и подвержено ошибкам ... существует ли какой-либо автоматизированный способ (в идеале как часть процесса сборки) с использованием Visual Studio 2010, чтобы гарантировать, что все классы в пространстве имен помечены [ Сериализуемый] атрибут?

Ответы [ 2 ]

5 голосов
/ 15 июля 2010

Один инструмент, о котором вы могли бы подумать, который легко интегрируется в вашу сборку, это NDepend . Это позволяет запускать различные метрики кода, которые затем можно использовать для предупреждения / сбоя сборки.

В CQL (встроенный язык запросов в NDepend) вы должны написать что-то вроде:

WARN IF Count > 0 IN SELECT TYPES FROM NAMESPACES "namespace" WHERE !IsSerializable  

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

NDepend может запускаться автоматически как часть вашей сборки в VS или на отдельном сервере сборки. Его также можно запускать как отдельное приложение.

4 голосов
/ 15 июля 2010

Вы не можете найти все возможные классы в пространстве имен - но вы можете найти все классы в данной сборке , которые имеют указанное пространство имен, и проверить их.

string dtoNamespace = ...;
Assembly assembly = ...;
var badClasses = assembly.GetTypes()
                         .Where(t => t.Namespace == dtoNamespace)
                         .Where(t => t.IsPublic) // You might want this
                         .Where(t => !t.IsDefined(typeof(SerializableAttribute),
                                     false);

Утверждаем, что badClasses пусто любым способом, который вы хотите:)

РЕДАКТИРОВАТЬ: Как упоминалось в комментариях, свойство IsSerializable здесь очень удобно)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...