Принудительное оформление атрибутов классов/методов
-
09-06-2019 - |
Вопрос
В продолжение моего недавнего вопроса о Большие и сложные объекты как результат веб-сервиса.Я думал о том, как обеспечить возможность сериализации всех будущих дочерних классов в 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