Nuestro software tiene varias clases que se deben encontrar dinámicamente a través de la reflexión. Todas las clases tienen un constructor con una firma específica a través de la cual el código de reflexión crea instancias de objetos.
Sin embargo, cuando alguien comprueba si se hace referencia al método (por ejemplo, a través de la lente de código de Visual Studio), la referencia a través de la reflexión no se cuenta. Las personas pueden perder sus referencias y eliminar (o cambiar) métodos aparentemente no utilizados.
¿Cómo debemos marcar / documentar los métodos destinados a ser llamados a través de la reflexión?
Idealmente, el método debe marcarse de tal manera que tanto los colegas como Visual Studio / Roslyn y otras herramientas automatizadas "vean" que el método debe llamarse mediante reflexión.
Sé de dos opciones que podemos usar, pero ambas no son del todo satisfactorias. Como Visual Studio no puede encontrar las referencias:
- Use un atributo personalizado y marque el constructor con este atributo.
- Un problema es que las propiedades de atributo no pueden ser una referencia de método, por lo tanto, el constructor seguirá mostrando que tiene 0 referencias.
- Los colegas que no estén familiarizados con el atributo personalizado probablemente lo ignorarán.
- Una ventaja de mi enfoque actual es que la parte de reflexión puede usar el atributo para encontrar el constructor al que debería llamar.
- Utilice los comentarios para documentar que un método / constructor está destinado a llamarse mediante reflexión.
- Las herramientas automatizadas ignoran los comentarios (y los colegas también podrían hacerlo).
- Los Comentarios de documentación Xml se pueden usar para que Visual Studio cuente una referencia adicional al método / constructor:
SeaMyPlugin
la clase cuyo constructor invocar mediante reflexión. Suponga que el código de reflexión de invocación busca constructores que toman unint
parámetro. La siguiente documentación muestra que la lente de código muestra que el constructor tiene 1 referencia:
/// <see cref="MyPlugin.MyPlugin(int)"/> is invoked via reflection
¿Qué mejores opciones existen?
¿Cuál es la mejor práctica para marcar un método / constructor que se pretende llamar mediante reflexión?