2013-07-10 11 views
10

Chcę wymusić użycie atrybutu, jeśli używany jest inny atrybut. Jeśli do właściwości dołączono specjalny atrybut podmiotu trzeciego, ten atrybut musi również zostać przekazany do właściwości Czy istnieje taka możliwość?Wymuś użycie atrybutu na właściwościach, jeśli mają już inny atrybut.

Na przykład:

[Some3rdPartyAttribute("...")] 
[RequiredAttribute("...)] 
public bool Example{get; set;} 

powinien przynieść żadnych Błąd kompilacji,

[Some3rdPartyAttribute("...")] 
public bool Example{get; set;} 

powinien przynieść błąd kompilacji lub ostrzeżenie.

Sam atrybut jest zdefiniowany tak, jak sam przykład z http://msdn.microsoft.com/en-US/library/z919e8tw(v=vs.80).aspx. Ale jak wymusić użycie atrybutu, jeśli używany jest inny atrybut?

Odpowiedz

2

Inną opcją jest użycie niektórych technik AOP. Na przykład:

PostSharp.

Używając go można w kompilacji przeanalizować kod yur i wyślij błąd, jeśli niektóre warunki nie spełniają Twoich wymagań.

Na konkretnym przykładzie atrybutów, można rzucić okiem na:

PostSharp 2.1: Reflecting Custom Attributes

+0

Podoba mi się odpowiedź AOP/IOC, niestety to jest coś, czego nie mogę wytłumaczyć mojemu szefowi ... – Offler

+0

@Offler: AOP nie jest dobre dla wszystkiego. Weźmy pod uwagę fakt, że tak, to bardzo pomaga w automatyzacji zadań w sposób deklaratywny, więc masz znacznie mniej kodu. Ale z drugiej strony ukrywa w sobie zachowanie, więc ten, kto go nie zna, lub gdy aplikacja staje się dość złożona, może prowadzić do problemów z obsługą złożoności. Więc jeśli z niego skorzystasz, używaj tego mądrze. – Tigran

+0

To właśnie miałem na myśli, że nie potrafię wyjaśnić użycia AOP mojemu szefowi. Również chciałbym go dla innych rzeczy, takich jak logowanie ... – Offler

4

Niestety, nie można wygenerować niestandardowych ostrzeżeń kompilatora z atrybutów. Niektóre atrybuty, takie jak System.ObsoleteAttribute, wygenerują ostrzeżenie lub błąd, ale jest to zakodowane na stałe w kompilatorze C#. Powinieneś znaleźć inne rozwiązanie swojego problemu, być może pozwalając Some3rdPartyAttribute dziedziczyć po RequiredAttribute?

W przeciwnym razie trzeba zmienić kompilator.

+0

thx. Atrybut 3rd Party (nie od nas) prawie nie odziedziczy po naszym wymaganym atrribute, co powinno zmusić programistę do podania niektórych informacji addditioanl, jeśli użyta zostanie funkcja 3rd partyallity. – Offler

0

Możesz napisać kod uruchamiany przy uruchomieniu aplikacji, który używa odbicia, a następnie rzuciłby wyjątki w czasie wykonywania, gdyby atrybut był używany bez odpowiedniego dopasowania, ale uważam, że jest to tak daleko, jak to możliwe, i osobiście nie brałbym tego pod uwagę dobre podejście, ponieważ musisz uruchomić aplikację, aby upewnić się, że jest zgodna z Twoimi zasadami.

Zobacz także PostSharp, które mogą ci pomóc.

+0

Nie chcę ich zmieniać w czasie wykonywania. Chcę tylko ostrzeżenia lub błędu podczas kompilacji, jeśli atrribute nie istnieje – Offler

+0

Edytowałem swoją odpowiedź, ponieważ początkowy komentarz był nieco nie na miejscu. W każdym razie, bez użycia refleksji i podnoszenia błędów w czasie wykonywania, nie widzę innej opcji. –

0

Jak na temat korzystania #warning testowanie + urządzenia? W ten sposób za każdym razem, gdy uruchomisz testy jednostkowe, wygenerowane zostanie ostrzeżenie (lub możesz po prostu użyć polecenia Debug.Fail zamiast #warning)

+0

Nie wiem, jak programowo wyświetlać ostrzeżenie tylko wtedy, gdy jeden atrybut jest tam i inny nie jest z odpowiednim tekstem? – Offler

+0

Jeśli używasz testów jednostkowych, można to łatwo zrobić ... po prostu sprawdź, czy metoda ma oba atrybuty i wyświetl ostrzeżenie, jeśli nie. Lub możesz mieć jedną metodę testową, która sprawdza, czy wszystkie metody, które używają jednego atrybutu, mają również inne wymagane atrybuty –

0

Możesz utworzyć aplikację konsolową, która będzie iterować przez wszystkie typy w korytku montażowym refleks, sprawdź, czy reguła jest spełniona i zwróć 0, jeśli jest, i jakiś inny kod błędu i błąd wyjściowy, jeśli reguła jest zepsuta.

Następnie uruchom tę aplikację konsolową jako zadanie po zakończeniu kompilacji.

0

O ile mi wiadomo, nie ma sposobu, aby sprawdzić atrybuty w czasie kompilacji.

Niedawno musiałem wymusić coś podobnego (wszystkie klasy wywodzące się z pewnej klasy bazowej wymagają określonych atrybutów).Skończyło się na ręcznym sprawdzeniu (z [Conditional("DEBUG")]) za pomocą odbicia w konstruktorze klasy bazowej. W ten sposób, gdy ktoś tworzy instancję klasy z brakującymi atrybutami, otrzymuje wyjątek. Ale może to nie mieć zastosowania w twoim przypadku, jeśli twoje klasy nie pochodzą z tej samej klasy.

Powiązane problemy