Il nostro software ha diverse classi che dovrebbero essere trovate dinamicamente tramite la riflessione. Tutte le classi hanno un costruttore con una firma specifica tramite la quale il codice di riflessione crea un'istanza di oggetti.
Tuttavia, quando qualcuno verifica se si fa riferimento al metodo (ad esempio tramite Visual Studio Code Lens), il riferimento tramite reflection non viene conteggiato. Le persone possono perdere i loro riferimenti e rimuovere (o modificare) metodi apparentemente inutilizzati.
Come dovremmo contrassegnare / documentare i metodi che devono essere chiamati tramite la riflessione?
Idealmente, il metodo dovrebbe essere contrassegnato in modo tale che sia i colleghi che Visual Studio / Roslyn e altri strumenti automatizzati "vedano" che il metodo deve essere chiamato tramite la riflessione.
Conosco due opzioni che possiamo usare ma entrambe non sono del tutto soddisfacenti. Poiché Visual Studio non è in grado di trovare i riferimenti:
- Utilizzare un attributo personalizzato e contrassegnare il costruttore con questo attributo.
- Un problema è che le proprietà degli attributi non possono essere un riferimento al metodo, quindi il costruttore mostrerà comunque come avere 0 riferimenti.
- I colleghi che non hanno familiarità con l'attributo personalizzato probabilmente lo ignoreranno.
- Un vantaggio del mio approccio attuale è che la parte di riflessione può usare l'attributo per trovare il costruttore che dovrebbe chiamare.
- Utilizzare i commenti per documentare che un metodo / costruttore deve essere chiamato tramite reflection.
- Gli strumenti automatici ignorano i commenti (e anche i colleghi potrebbero farlo).
- I commenti alla documentazione Xml possono essere utilizzati per fare in modo che Visual Studio conteggi un riferimento aggiuntivo al metodo / costruttore:
SiaMyPlugin
la classe il cui costruttore deve invocare tramite reflection. Supponiamo che il codice di riflessione invocante cerchi costruttori che accettano unint
parametro. La seguente documentazione indica che il codice obiettivo mostra il costruttore con 1 riferimento:
/// <see cref="MyPlugin.MyPlugin(int)"/> is invoked via reflection
Quali opzioni migliori esistono?
Qual è la migliore pratica per contrassegnare un metodo / costruttore che deve essere chiamato tramite la riflessione?