2016-02-25 10 views
12

A partire da ora sto usando un po 'di generazione di codice, solitamente in combinazione con classi parziali. Fondamentalmente la configurazione è la seguente:Fornire un suggerimento a IntelliSense che una classe parziale non dovrebbe essere modificata

  • Classe parziale contenente codice generato. Alcuni di questo codice chiameranno metodi parziali. Il codice viene rigenerato molto tempo. Il generatore di codice è in alcuni casi uno strumento personalizzato.
  • I metodi parziali vengono implementati manualmente in un file separato.

Il problema è che quando utilizzo le funzionalità di Intellisense come "metodo di generazione", per qualche motivo vengono generate nel file contenente il codice generato. Ovviamente non lo voglio

La mia domanda è: è possibile generare qualche suggerimento che dice a Intellisense che non dovrebbe toccare certi file "cs" (ma invece l'altra classe parziale)?


Aggiornamento

Col senno di poi avrei notato che sto usando uno strumento personalizzato per generare il codice. Non è un EF o una trasformazione semplice; c'è un po 'di logica nella generazione del codice. Inoltre, genera uno spazio dei nomi completo e una struttura di classe con classi parziali. Lo 'spazio dei nomi radice' si trova estraendolo dal file csproj e quindi usando la struttura delle cartelle per capire lo spazio dei nomi assoluto (è simile a come lo fa Linq2sql).

La risposta suggerita da xanatos (grazie!) Funziona: intellisense ordina la sua operazione sul nome, quindi ordina alfabeticamente il nome e quindi seleziona il primo elemento nell'elenco. Ciò significa che è possibile generare un zzzz.foo.cs che (anche se un po 'brutto) funzionerà bene. Ho appena eseguito alcuni esperimenti e ho scoperto che la funzione find all references restituisce l'ordine che VS sembra utilizzare. A quanto pare, funziona così:

Supponiamo che tu abbia uno strumento personalizzato che funzioni sul nome file foo.bar e lo trasformi in foo.cs. Lo strumento personalizzato genererà il contenuto come stringa e lo riporterà a Visual Studio (è così che funzionano gli strumenti personalizzati ...). Il risultato sarà in un file chiamato foo.cs.

Ora, sono stato molto sorpreso di fondare che IntelliSense non non sorta come foo.cs ma piuttosto come foo.bar\foo.cs. In altre parole: indipendentemente dal nome dell'output "cs" nel tuo strumento personalizzato, devi rinominare il file di base foo.bar in qualcosa come zoo.bar.

Mentre quello potrebbe essere una soluzione, sono esitante ad accettarlo come risposta, perché dovrei dare file nel mio progetto strani nomi (i nomi hanno significato ...). Inoltre, alcuni dei miei strumenti personalizzati dipendono dai loro nomi di file, in modo tale da essere anche danneggiati ...

Pertanto, sono ancora aperto per suggerimenti su come risolvere questo problema correttamente.

risposta

2

Supponendo che si parli di EF, cambio sempre il file modello (.tt) in modo che il nome file del file generato automaticamente sia [classname] .model.cs. Questo significa che il mio file parziale, che per convenzione è chiamato [nomeview] .cs, è alfabeticamente il primo e sembra sempre essere scelto per la generazione automatica.

Tutto quello che dovete fare è trovare/sostituire tutto il:

fileManager.StartNewFile(entity.Name + ".cs"); 

Con:

fileManager.StartNewFile(entity.Name + ".model.cs"); 

Ci dovrebbe essere 3.

Questo ha altri benefici come file generati automaticamente sono chiaramente indicati nel nome del file.

Non ho ancora idea del motivo per cui non l'hanno fatto in primo luogo.

Se non stai parlando dell'EF, lo stesso trucco di usare il nome del file per ordinarli dovrebbe funzionare.

3

Da un semplice test che ho eseguito su VS2013, sembra che Visual Studio 2013 aggiunga il metodo al "primo" file che trova in Solution Explorer. Quindi potresti semplicemente aggiungere un .something.cs al tuo nome file, come MyClass.generated.cs vs MyClass.cs. Essere consapevoli del fatto che il VS2013 sembra utilizzare il "percorso completo", con l'ordinamento dei percorsi in base al nome. Quindi:

Z \ MyClass.cs

viene dopo

MyClass.generated.cs

(e Intellisense metterà codice nella MyClass.generated.cs) anche mentre in il Solution Explorer tutte le cartelle sono ordinate per prime.

esempio completa:

Un \ MyClass.gen3.cs

MyClass.gen2.cs

Z \ MyClass.gen1.cs

Questo dovrebbe essere il ordine come "visto" dall'Intellisense, quindi inserirà le nuove classi in A\MyClass.gen3.cs.

+0

Quindi, in pratica, quello che stai dicendo è che utilizza il percorso completo .... Avevo già paura di questo: alcuni dei miei generatori (per esempio il mio generatore di codice lexer/parser) produce completo (spazio dei nomi figlio) gerarchie di classi in un unico file generato. Fondamentalmente ciò significa che non importa come lo chiamo, genererà il codice nel file sbagliato. – atlaste

+0

@atlaste C'è sempre il file 'z.z.z.zenerated.cs' :-) – xanatos

+0

Sì, ci ho pensato anche io - il problema è che quella soluzione non funziona se ordina la cartella corrente sopra le sottocartelle. Dovrò provarlo però. – atlaste

Problemi correlati