Domanda

OK, questo tipo di seguito la mia domanda precedente.

Quello che mi piacerebbe davvero fare è creare una sorta di attributo che mi permette di decorare un metodo che interrompere la compilazione.Molto simile Obsoleti("ragione", true) attributo, ma senza falsamente identificazione obsoleti con codice.

Per chiarire:Io non voglio rompere le build su QUALSIASI F6 (Build) premere, ho solo voglia di rompere la build se un metodo decorate con l'attributo è chiamato in qualche altra parte del codice.Come ho detto, simile obsoleto, ma non è la stessa.

So di non essere solo in questo, dal momento che altri utenti non vogliono utilizzarlo per altri motivi.Non ho mai creato attributi personalizzati prima, quindi è tutto nuovo per me!

È stato utile?

Soluzione

Se questo è per la serializzazione XML e NHibernate, dove si desidera che il costruttore senza parametri per essere accessibile (come è il caso in esempio si fa riferimento), quindi utilizzare un privato o protetto costruttore senza parametri per la serializzazione, o un costruttore protetto per NHibernate.Con la versione protetta, si sta aprendo da soli per le classi ereditate essere in grado di chiamare il codice.

Se non si desidera che il codice di chiamata di un metodo, non di renderla accessibile.

EDIT:Forse, anche per rispondere alla domanda più profonda, per quanto ne so il compilatore conosce solo tre attributi: Obsoleti, Condizionale, e AttributeUsage.Per aggiungere una gestione speciale per gli altri attributi sarebbe necessario modificare il compilatore.

Altri suggerimenti

Penso che questo sarebbe un ottimo richiesta di funzionalità per Microsoft:Creare una classe base astratta attributo CompilerExecutedAttribute che il compilatore processi in qualche modo o che possono influenzare il processo di compilazione.Quindi si potrebbe ereditare da questo attributo e implementare diverse operazioni, quali ad esempioemettono un errore o un avviso.

Se si considera un avviso (che è quello che [Obsolete] getta) costruire-rottura, quindi basta usare il #avviso direttiva del compilatore.

Edit:Non l'ho mai usato, ma #errore è inoltre disponibile.

Penso che l'unica infallibile modo sarebbe quello di estendere il Visual Studio (attraverso VSIP) e sottoscrivere l'evento corretto (magari in EnvDTE.BuildEvents) classe e controllare il codice per l'utilizzo del costruttore, e di annullare la build se si rileva.

Questo è tutto, cominciando a sembrare un po ' come Ieri TDWTF. :-)

Io sono d'accordo con Greg:fare il backup di un attributo per questo.

E se siete veramente sul serio, magari trovare un modo per capire se il costruttore si accede da qualcosa di diverso XMLSerializer e generare un'eccezione se.

Vi suggerisco di utilizzare il #errore direttiva.

Un'altra bella attributo sconosciuto che potrebbe fare il lavoro è il attributo condizionale (a seconda di quello che stai cercando di ahieve)

[Conditional("CONDITION")] 
public static void MiMethod(int a, string msg)

rimuovere la chiamata al metodo da il codice stesso se "MY_CONDITION" è definito.

Creare una regola FxCop, e aggiungere FxCop per l'integrazione di costruire, in modo da controllare questo.

Riceverai avvisi, piuttosto che una mancanza di costruire.Gli attributi di "eseguire" in tempo di riflessione, piuttosto che costruire volta.

In alternativa (e questo è piuttosto brutto) mettere una direttiva del compilatore di tutto il metodo non vuoi essere chiamato.Quindi il codice di interruzione se la chiamate voi, ma è possibile impostare una generazione che passa il diritto di direttiva del compilatore e non.

Lanciare un'eccezione personalizzata e test di unità, per un passaggio di generazione post

Rispondere 4 anni più tardi :)

Ho avuto la stessa domanda se ci fosse un'alternativa al Obsoleti.

Da quello che mi ricordo (channel9 video) un po ' di tempo fa, Microsoft ha dichiarato che sta lavorando a dare sviluppatori l'accesso a qualcosa di simile a un compilatore api a un certo punto in futuro è immaginabile che si potrebbe scrivere un compilatore "plugin" che avrebbe consentito a decorare i metodi con i tuoi attributi personalizzati e dire al compilatore di annullare se sembra che l'decorato codice potrebbe essere come detto altrove nel codice etc.

Che sarebbe in realtà essere abbastanza freddo quando si pensa a questo proposito.Inoltre, mi ricorda che dovrei provare a leggere l'andamento del compilatore api cosa che MS sta lavorando su ...

Perché non basta fare qualcosa?Un attributo sconosciuto sarebbe sicuramente interrompere la compilazione.

[MyMadeUpAttributeThatBreaksTheBuildForSure]
public class NotDoneYet {}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top