Kiedy używasz ObsoleteAtribute w .Net daje ci ostrzeżenia kompilatora, informujące cię, że obiekt / metoda / właściwość jest przestarzała i należy użyć czegoś innego. Obecnie pracuję nad projektem, który wymaga wielu zmian w kodzie byłych pracowników. Chcę napisać atrybut niestandardowy, którego mogę użyć do oznaczania metod lub właściwości, które będą generować ostrzeżenia kompilatora, które będą wyświetlać wiadomości, które piszę. Coś takiego
[MyAttribute("This code sux and should be looked at")]
public void DoEverything()
{
}
<MyAttribute("This code sux and should be looked at")>
Public Sub DoEverything()
End Sub
Chcę, aby to wygenerowało ostrzeżenie kompilatora, które mówi: „Ten kod sux i należy mu się przyjrzeć”. Wiem, jak utworzyć atrybut niestandardowy, pytanie brzmi, jak spowodować, aby generował ostrzeżenia kompilatora w Visual Studio.
c#
.net
vb.net
attributes
compiler-warnings
Micheasza
źródło
źródło
Odpowiedzi:
Aktualizacja
Jest to teraz możliwe dzięki Roslyn (Visual Studio 2015). Można budować na analizator kodu do sprawdzenia atrybutu niestandardowego
Nie wierzę, że to możliwe. ObsoleteAttribute jest traktowany specjalnie przez kompilator i jest zdefiniowany w standardzie C #. Dlaczego do diabła nie można zaakceptować ObsoleteAttribute? Wydaje mi się, że jest to właśnie sytuacja, do której został zaprojektowany, i zapewnia dokładnie to, czego potrzebujesz!
Należy również pamiętać, że program Visual Studio odbiera ostrzeżenia generowane przez ObsoleteAttribute również w locie, co jest bardzo przydatne.
Nie chcę być pomocny, po prostu zastanawiasz się, dlaczego nie chcesz go używać ...
Niestety ObsoleteAttribute jest zapieczętowany (prawdopodobnie częściowo z powodu specjalnego traktowania), dlatego nie możesz podklasować swojego własnego atrybutu z tego.
Ze standardu C #: -
Czy to nie podsumowuje twoich potrzeb? ... nie zamierzasz zrobić nic lepszego niż to, nie sądzę.
źródło
[Obsolete]
tagu, jest to, że może powodować problemy, jeśli trzeba wykonać XmlSerialization z właściwością. Dodanie[Obsolete]
tagu dodaje również[XmlIgnore]
atrybut za kulisami.Warto spróbować.
Nie możesz rozszerzyć Obsolete, ponieważ jest ostateczny, ale może możesz stworzyć własny atrybut i oznaczyć tę klasę jako przestarzałą w następujący sposób:
Gdy oznaczysz metody atrybutem „MustRefactor”, pojawią się ostrzeżenia dotyczące kompilacji. Generuje ostrzeżenie o czasie kompilacji, ale komunikat o błędzie wygląda śmiesznie, powinieneś to zobaczyć i wybrać. To jest bardzo bliskie temu, co chciałeś osiągnąć.
UPDATE: Za pomocą tego kodu generuje ostrzeżenie (niezbyt ładne, ale nie sądzę, aby było coś lepszego).
źródło
IDisposable
te przestarzałe klasy, oznacza to, że możesz opakować swój podejrzany kod testowy wusing
blok. Tak:using(new MustRefactor()){DodgyCode();}
. Następnie możesz znaleźć wszystkie zastosowania, kiedy skończysz. Używam tego teraz doSleep
wątku wewnątrz pętli for, którą muszę sztucznie spowolnić w celu debugowania.W niektórych kompilatorach możesz użyć #warning, aby wygenerować ostrzeżenie:
W kompilatorach firmy Microsoft zazwyczaj można użyć pragmy komunikatu:
Wspomniałeś o .Net, ale nie sprecyzowałeś, czy programujesz w C / C ++ czy C #. Jeśli programujesz w C #, powinieneś wiedzieć, że C # obsługuje format #warning .
źródło
Obecnie jesteśmy w trakcie wielu refaktoryzacji, podczas których nie mogliśmy od razu wszystkiego naprawić. Po prostu używamy polecenia #warning preproc, w którym musimy cofnąć się i spojrzeć na kod. Pojawia się w danych wyjściowych kompilatora. Nie sądzę, aby można było przypisać to do metody, ale można by było umieścić je tylko wewnątrz metody, a nadal łatwo jest znaleźć.
źródło
W VS 2008 (+ sp1) # ostrzeżenia nie wyświetlają się poprawnie na liście błędów po Clean Soultion & Rebuild Solution, nie wszystkie z nich. Niektóre ostrzeżenia są wyświetlane na liście błędów dopiero po otwarciu określonego pliku klasy. Więc byłem zmuszony użyć atrybutu niestandardowego:
Więc kiedy oflaguję nim jakiś kod
Generuje takie ostrzeżenia:
Nie mogę zmienić treści ostrzeżenia, nie wyświetla się „Jakiś komentarz”. Lista błędów. Ale przeskoczy na właściwe miejsce w pliku. Jeśli więc chcesz zmieniać takie komunikaty ostrzegawcze, utwórz różne atrybuty.
źródło
To, co próbujesz zrobić, jest nadużyciem atrybutów. Zamiast tego użyj listy zadań programu Visual Studio. Możesz wpisać komentarz do swojego kodu w następujący sposób:
Następnie otwórz Widok / Lista zadań z menu. Lista zadań ma dwie kategorie, zadania użytkownika i komentarze. Przełącz się na Komentarze, a zobaczysz wszystkie swoje // Todo: 's. Dwukrotne kliknięcie TODO spowoduje przejście do komentarza w kodzie.
Glin
źródło
Myślę, że nie możesz. O ile wiem, obsługa ObsoleteAttribute jest zasadniczo zakodowana na stałe w kompilatorze C #; nie możesz zrobić niczego podobnego bezpośrednio.
To, co możesz zrobić, to użyć zadania MSBuild (lub zdarzenia po kompilacji), które wykonuje niestandardowe narzędzie dla właśnie skompilowanego zestawu. Narzędzie niestandardowe będzie odzwierciedlać wszystkie typy / metody w zestawie i zużywa niestandardowy atrybut, w którym to momencie może drukować do domyślnego lub błędu TextWriters System.Console.
źródło
Patrząc na źródło ObsoleteAttribute , nie wygląda na to, że robi coś specjalnego, aby wygenerować ostrzeżenie kompilatora, więc chciałbym iść z @ technophile i powiedzieć, że jest na stałe zakodowany w kompilatorze. Czy jest jakiś powód, dla którego nie chcesz używać ObsoleteAttribute do generowania komunikatów ostrzegawczych?
źródło
Istnieje kilka komentarzy, które sugerują wstawienie ostrzeżeń lub pragmatów. Przestarzałe działa w zupełnie inny sposób! Oznaczając przestarzałą funkcję biblioteki L, przestarzały komunikat pojawia się, gdy program wywołuje funkcję, nawet jeśli programu wywołującego nie ma w bibliotece L. Ostrzeżenie powoduje wyświetlenie komunikatu TYLKO, gdy L jest kompilowane.
źródło
Oto implementacja Roslyn, dzięki czemu możesz tworzyć własne atrybuty, które w locie wyświetlają ostrzeżenia lub błędy.
Utworzyłem atrybut Type Called,
IdeMessage
który będzie atrybutem generującym ostrzeżenia:Aby to zrobić, musisz najpierw zainstalować Roslyn SDK i uruchomić nowy projekt VSIX z analizatorem. Pominąłem niektóre mniej istotne fragmenty, takie jak wiadomości, możesz dowiedzieć się, jak to zrobić. W swoim analizatorze robisz to
W tym przypadku nie ma CodeFixProvider, możesz go usunąć z rozwiązania.
źródło