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

StackOverflow https://stackoverflow.com/questions/19454

Вопрос

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

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

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

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

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

ОБНОВЛЯТЬ:

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

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

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

Это было полезно?

Решение

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

ОБНОВЛЯТЬ:Вы сказали: «Похоже, мне просто придется засучить рукава и убедиться, что модульные тесты поддерживаются коллективно» — вам это не обязательно.Просто напишите общий тестовый класс, который использует отражение для поиска всех классов, которые необходимо утвердить.Что-то вроде этого:

[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);
            }
        }
    }
}

Другие советы

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top