2015-01-28 5 views
5

Anche se dovrebbe essere impossibile a causa di #define essere una direttiva di pre-processore vorrei chiedere:Ottenere un elenco di variabili #define

E 'possibile ottenere un elenco dei #define 'd variabili all'interno il programma attuale? Rispettivamente, un elenco di simboli di compilazione condizionale, definiti all'interno delle proprietà del progetto.

Perché avrei bisogno di questo? Gestisco le estensioni utilizzando i simboli. Sto cercando di ottenere una lista di loro per aggiungerli nella mia finestra about come

Enabled Extensions: 
CUSTOMER1_ABC_EXTENSION 
CUSTOMER2_XYZ_EXTENSION 

Senza scrivere codice specifico per ogni estensione.

+2

correlati: http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem –

+1

Si potrebbe esaminare il file sorgente all'interno del programma. –

+1

Roslyn, essendo un Compilatore-as-a-service, può farlo. Vedere https://github.com/dotnet/roslyn – haim770

risposta

0

risolto utilizzando

public static class BuildVariables 
{ 
    public static List<string> DefinedVariables = new List<string>() 
    { 
     #if CUSTOMER1_ABC_EXTENSION 
     "CUSTOMER1_ABC_EXTENSION", 
     #endif 
     #if CUSTOMER2_XYZ_EXTENSION 
     "CUSTOMER2_XYZ_EXTENSION", 
     #endif 
    }; 
} 

che è abbastanza sporca e richiede un cambiamento ogni volta che viene introdotto un nuovo simbolo. Non mi piace.

+0

@Sinatr È sporco perché costringe lo sviluppatore a ricordare di inserire un nuovo simbolo nell'elenco. Non è un problema farlo - è solo s * cks. E no, non ho un codice di inizializzazione né una ricerca per le estensioni. Sarei felice se tu concedessi di smettere di assumere cose che non puoi sapere. Le estensioni sono piuttosto in linea rispetto a un modulo separato o simile. Perché? Come ho descritto sopra, le classi che rappresentano le tabelle db sono diverse per alcuni clienti. Quindi abilito alcuni di loro con il simbolo. So che QUESTA è la parte sporca qui ma non ho il tempo di sistemarla, come detto sopra. – SlapY

1

Sembrerebbe che la risposta cannonical è che non si può fare. La documentazione MSDN per #define dice:

L'ambito di un simbolo che è stato creato utilizzando #define è il file in cui è stato definito il simbolo.

Questo suggerirebbe che è meglio usare il riflesso. Forse potresti usare una classe Attribute per decorare le estensioni e fornire informazioni di runtime che puoi testare.

+0

È possibile impostare i simboli utilizzando le impostazioni del progetto (simboli di configurazione condizionale). – SlapY