Сведения о вопросе

NOTtoday

04:59, 1st August, 2020

Теги

Принудительное оформление атрибутов классов / методов

Просмотров: 535   Ответов: 5

Следуя моему недавнему вопросу о больших, сложных объектах Как результате веб-службы . Я думал о том, как я могу гарантировать, что все будущие дочерние классы сериализуются в XML.

Теперь, очевидно, я мог бы реализовать интерфейс IXmlSerializable , а затем бросить в него читателя / писателя, но я хотел бы избежать этого, поскольку это означает, что мне нужно создавать экземпляр читателя/писателя всякий раз, когда я хочу это сделать, и 99.99% времени я буду работать со строкой, поэтому я могу просто написать свой собственный.

Однако, чтобы сериализовать до XML, я просто украшаю класс и его членов Xml? ?? атрибуты ( XmlRoot , XmlElement и др.) и затем передать его в XmlSerializer и StringWriter , чтобы получить строку. И это все хорошо. Я намерен поместить метод для возврата строки в общий метод утилиты, поэтому мне не нужно беспокоиться о типе и т. д.

То, что меня беспокоит, заключается в следующем: если я не украшаю класс(ы) необходимыми атрибутами, ошибка не возникает до времени выполнения.

Есть ли способ применить украшение атрибута? Можно ли это сделать с помощью FxCop? (Я еще не использовал FxCop)

UPDATE:

Извините за задержку в получении этого закрыть ребята, много дел!

Определенно нравится идея использовать отражение, чтобы сделать это в тестовом случае, а не прибегать к FxCop (например, чтобы держать все вместе).. Ответ Фредрика Калсета был фантастическим, спасибо за включение кода, поскольку мне, вероятно, потребовалось бы немного копать, чтобы понять, как это сделать самому!

+1 к другим ребятам за аналогичные предложения :)



  Сведения об ответе

P_S_S

06:24, 5th August, 2020

Я бы написал модульный / интеграционный тест, который проверяет, что любой класс, соответствующий некоторым заданным критериям (т. е. подкласс X), оформлен соответствующим образом. Если вы настроили сборку для запуска с тестами, вы можете получить сбой сборки, когда этот тест завершится неудачей.

UPDATE: Вы сказали:" Похоже, мне просто придется засучить рукава и убедиться, что модульные тесты поддерживаются коллективно " - вам это не нужно. Просто напишите общий тестовый класс, который использует отражение, чтобы найти все классы,которые должны быть утверждены. Что-то вроде этого:

[TestClass]
public class When_type_inherits_MyObject
{
    private readonly List<Type> _types = new List<Type>();

    public When_type_inherits_MyObject()
    {
        // lets find all types that inherit from MyObject, directly or indirectly
        foreach(Type type in typeof(MyObject).Assembly.GetTypes())
        {
            if(type.IsClass && typeof(MyObject).IsAssignableFrom(type))
            {
                _types.Add(type);
            }
        }
    }

    [TestMethod]
    public void Properties_have_XmlElement_attribute
    {
        foreach(Type type in _types)
        {
            foreach(PropertyInfo property in type.GetProperties())
            {
                object[] attribs = property.GetCustomAttributes(typeof(XmlElementAttribute), false);
                Assert.IsTrue(attribs.Count > 0, "Missing XmlElementAttribute on property " + property.Name + " in type " + type.FullName);
            }
        }
    }
}


  Сведения об ответе

JUST___

06:07, 18th August, 2020

Вы можете написать модульные тесты для проверки такого рода вещей - это в основном использует отражение.

Учитывая тот факт, что это возможно, я думаю, что также можно было бы написать правило FxCop, но я никогда не делал этого.


  Сведения об ответе

pumpa

20:01, 12th August, 2020

Вы можете написать правило FxCop или даже проверить наличие атрибутов, вызвав GetType() в конструкторе базового класса и отразив возвращаемый тип.


  Сведения об ответе

KOMP

18:11, 29th August, 2020

Вы также можете использовать этот concept/post-processor для принудительного применения отношений между атрибутами и использовать аналогичный login для принудительного применения отношений между классами и атрибутами во время компиляции:

http://www.st.informatik.tu-darmstadt.de/database/publications/data/cepa-mezini-gpce04.pdf?id=92


  Сведения об ответе

crush

04:11, 13th August, 2020

Хорошее правило FXCop (и то, которое я нахожу нужным прямо сейчас) состояло бы в том, чтобы проверить, что все объекты, добавляемые в сеанс ASP.NET, имеют атрибут Serializable. Я пытаюсь перейти из состояния сеанса InProc в состояние сервера SQL. В первый раз, когда я запросил страницу, Мой сайт взорвался на мне, потому что несериализуемые объекты хранились в сеансе. Затем возникла задача поиска по всему исходному коду, ища каждый экземпляр, где объект установлен в сеансе... FXCop было бы хорошим решением. Есть над чем поработать...


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться