2012-08-23 13 views
23

Mi piace il modo in cui String.Format utilizza gli argomenti per inserire le variabili nella stringa che sta formattando. Questo si chiama Composite Formating ed è discusso da MSDN here.Come faccio a rendere il mio metodo simile a String.Format usando Composite Formatting in C#

voglio questa funzionalità con la mia facciata di registrazione:

string foo = "fancy"; 
string bar = "message"; 
log.Debug("My {0} log {1}.", foo, bar) 

mio ILoggerFacade ha metodo la seguente firma:

void Debug<T>(T message, params Object[] args); 

E, so di poter implementare questa molto semplicemente:

ILog m_Log = \\some logging implementation 
public void Debug<T>(T message, params Object[] args) 
{ 
    m_Log.Debug(String.Format(message, args)); 
} 

Tuttavia, in Visual Studio non riesco a ottenere l'evidenziazione di fantasia di {0}, {1}, ... ar guments:

Argument highlighting for Composite Formatting methods

Credo che sia ReSharper che è resposible per loro, e sembra che si tratta solo ignorando gli argomenti di formattazione e dare nessun aiuto "intellisense". Questo non va bene dato che gli altri sviluppatori che useranno la facciata si aspetteranno questo.

Come ottengo argomento evidenziazione e "intellisense" per metodi personalizzati in formato simile a come funzionano:

Console.WriteLine(...) 
String.Format(...) 
etc... 

Qualsiasi aiuto sarebbe apprezzato.

risposta

29

Controllare ReSharpers External Annotations. In particolare, si desidera utilizzare StringFormatMethodAttribute per questo.

Per utilizzare le annotazioni esterne ci sono in realtà 3 metodi. Due che scandiscono, e uno che devi leggere tra le righe per vedere.

  1. Riferimento "JetBrains.Annotations.dll". Consiglierei contro questo. Non mi piace l'idea di copiare la DLL, o dover fare riferimento alla directory di installazione di ReSharper. Ciò potrebbe causare problemi se si aggiorna o si reinstalla.

  2. Copia e incolla dichiarazioni di attributi nella soluzione. Lo consiglierei perché ti dà più controllo. Inoltre, puoi sbarazzarti di ReSharper (perché qualcuno dovrebbe farlo? Sono accadute cose più strane, immagino), e comunque fornisci questa funzionalità a tutti coloro che consumano la tua libreria. Ci sono istruzioni passo passo su come farlo nel primo collegamento.

  3. Creare un file XML, simile a quello per cui viene utilizzato per gli assembly .NET. L'ho fatto per il Silverlight Unit Test Framework. ReSharper non riconosce questi test per impostazione predefinita.

    Per fare questo

    1. creare un nome file <assembly>.xml e metterlo in "ReSharper \ VXX \ bin \ ExternalAnnotations".
    2. Aggiungere un elemento radice "<assembly name="<assembly>">
    3. Ora aggiungere <member> elementi per ciascun membro a cui si desidera assegnare un attributo.

    Non è consigliabile farlo per il proprio codice. Tuttavia, se si dispone di un assembly che si desidera avere questa funzionalità, ma non è possibile modificare, questo è il modo per farlo. Questo si applica solo sulla tua macchina e ogni sviluppatore che usa l'assembly dovrà copiare il file xml.

+2

Circa terzo modo per aggiungere annotazioni - è possibile inserire file xml annotazione vicino al gruppo, il nome è da .ExternalAnnotations.xml e impegnarsi ai tuoi CVS. Tutti gli altri sviluppatori lo otterranno automaticamente durante l'aggiornamento. – derigel

+0

@derigel Buona chiamata. Me ne sono dimenticato. Scommetto che potresti fare qualcosa per includerlo anche in un pacchetto NuGet. Tuttavia, consiglierei comunque l'opzione 2, se disponibile. – cadrell0

+2

Per eseguire il passaggio 2 come suggerito: http://www.jetbrains.com/resharper/webhelp/Code_Analysis__Annotations_in_Source_Code.html – Oliver

Problemi correlati