Nasze oprogramowanie ma kilka klas, które należy dynamicznie znaleźć poprzez odbicie. Wszystkie klasy mają konstruktor z określoną sygnaturą, za pośrednictwem której kod odbicia tworzy instancję obiektów.
Jednak gdy ktoś sprawdzi, czy metoda jest przywołana (na przykład za pomocą soczewki Visual Studio Code Lens), referencja za pomocą odbicia nie jest liczona. Ludzie mogą przegapić swoje referencje i usunąć (lub zmienić) najwyraźniej nieużywane metody.
Jak powinniśmy oznaczać / dokumentować metody, które mają być wywoływane poprzez refleksję?
Najlepiej byłoby, gdyby metoda została oznaczona w taki sposób, aby zarówno współpracownicy, jak i Visual Studio / Roslyn i inne zautomatyzowane narzędzia „zobaczyli”, że metoda ma zostać wywołana poprzez odbicie.
Znam dwie opcje, których możemy użyć, ale obie nie są całkiem satysfakcjonujące. Ponieważ Visual Studio nie może znaleźć referencji:
- Użyj niestandardowego atrybutu i oznacz konstruktorem tym atrybutem.
- Problem polega na tym, że właściwości atrybutu nie mogą być odwołaniem do metody, dlatego konstruktor nadal będzie pokazywał, że ma 0 odwołań.
- Koledzy nieznający atrybutu niestandardowego prawdopodobnie go zignorują.
- Zaletą mojego obecnego podejścia jest to, że część refleksyjna może użyć atrybutu do znalezienia konstruktora, który powinien wywołać.
- Użyj komentarzy, aby udokumentować, że metoda / konstruktor ma być wywoływany przez odbicie.
- Zautomatyzowane narzędzia ignorują komentarze (i koledzy też mogą to robić).
- Komentarze do dokumentacji XML można wykorzystać, aby Visual Studio zliczało dodatkowe odwołanie do metody / konstruktora:
NiechMyPlugin
będzie klasą, której konstruktor może wywoływać poprzez odbicie. Załóżmy, że wywołujący kod refleksyjny szuka konstruktorów, które pobierająint
parametr. Poniższa dokumentacja pokazuje, że soczewka kodu pokazuje konstruktor mający 1 referencję:
/// <see cref="MyPlugin.MyPlugin(int)"/> is invoked via reflection
Jakie są lepsze opcje?
Jaka jest najlepsza praktyka oznaczania metody / konstruktora, który ma zostać wywołany przez odbicie?