Наше программное обеспечение имеет несколько классов, которые должны быть динамически найдены с помощью отражения. Все классы имеют конструктор с определенной сигнатурой, посредством которой код отражения создает объекты.
Однако, когда кто-то проверяет, есть ли ссылка на метод (например, через Visual Studio Code Lens), ссылка через отражение не учитывается. Люди могут пропустить свои ссылки и удалить (или изменить) явно неиспользуемые методы.
Как мы должны пометить / документировать методы, предназначенные для вызова через отражение?
В идеале метод должен быть помечен таким образом, чтобы как коллеги, так и Visual Studio / Roslyn и другие автоматизированные инструменты «видели», что метод предназначен для вызова с помощью отражения.
Я знаю два варианта, которые мы можем использовать, но оба они не совсем удовлетворяют. Поскольку Visual Studio не может найти ссылки:
- Используйте пользовательский атрибут и пометьте конструктор этим атрибутом.
- Проблема заключается в том, что свойства атрибута не могут быть ссылкой на метод, поэтому конструктор все равно будет отображаться как имеющий 0 ссылок.
- Коллеги, не знакомые с пользовательским атрибутом, вероятно, проигнорируют его.
- Преимущество моего текущего подхода состоит в том, что часть отражения может использовать атрибут, чтобы найти конструктор, который он должен вызвать.
- Используйте комментарии, чтобы задокументировать, что метод / конструктор предназначен для вызова через отражение.
- Автоматизированные инструменты игнорируют комментарии (и коллеги могут делать то же самое).
- Комментарии к XML-документации могут использоваться для подсчета в Visual Studio дополнительной ссылки на метод / конструктор:
ПозвольтеMyPlugin
быть классом, конструктор которого вызывается через отражение. Предположим, что вызывающий код отражения ищет конструкторы, которые принимаютint
параметр. Следующая документация показывает, что кодовая линза показывает конструктор, имеющий 1 ссылку:
/// <see cref="MyPlugin.MyPlugin(int)"/> is invoked via reflection
Какие лучшие варианты существуют?
Какова наилучшая практика для маркировки метода / конструктора, который должен вызываться с помощью отражения?