2012-05-15 8 views
6

ho una classe denominata LocalConstants ....Accesso Costanti di classe statico che fa riferimento a Impostazioni App Config File

public static class LocalConstants { 
    public static string DM_PATH = ConfigurationManager.AppSettings["DMQueue"]; 
    public static string PROJECT_PATH = ConfigurationManager.AppSettings["MSQueue"]; 
} 

Quando si cerca di accedere a questa classe nel mio programma principale io sono sempre un'eccezione di riferimento null. Qualsiasi cosa da ConfigurationManager.AppSettings [è sempre nullo. Ma se scrivo

//The value is returned fine 
    string bo=ConfigurationManager.AppSettings["MSQueue"]; 

questo compila bene, ma è sempre nullo e lancia un NullRefexception

string moomoo = LocalConstants.PROJECT_PATH; 

L'eccezione è L'inizializzatore di tipo per 'TestCodeOutOnSide.LocalConstants' ha generato un'eccezione.

innerException è il riferimento di base non impostato su un'istanza di un oggetto.

Anche se cambio il project_path a

public static readonly string PROJECT_PATH = @"FORMATNAME:DIRECT=OS:serus-nickl\RMQDEV"; 

ottengo la stessa eccezione

Tutte le idee?

+0

È 'LocalConstants' nello stesso pr oject come app.config? – IAbstract

+0

Sì, tutto è nello stesso progetto –

risposta

0

ho chiamato questo

public static string Environment = AppEnvironmentVariable.ToUpper() != "PROD" ? "***FROM " + AppEnvironmentVariable.ToUpper() + "** " : ""; 

Prima di questo

public static string AppEnvironmentVariable = "DEV"; 

Nel file LocalConstants che ha rotto a causa di quello che ha detto Josh su inizializzazione campo statico

5

Per cominciare, se si sta facendo questo per fornire un qualche tipo di vantaggio in termini di prestazioni, si dovrebbe sapere che questi sono memorizzati nella cache. Vedere ConfigurationManager.AppSettings Caching, per rimuovere qualsiasi.

In secondo luogo il problema è molto probabile che lo Static field initialization non funzioni come previsto. Quindi il tuo codice come scritto non garantisce che sia stato eseguito lo ConfigurationManager.AppSettings. Dal codice di esempio articolo collegato:

potrebbe produrre sia l'output:

Init A 
Init B 
1 1 

o l'uscita:

Init B 
Init A 
1 1 

[EDIT per commentare OP]

Ci deve essere qualcos'altro coinvolti come:

public static class LocalConstants 
{ 
    public static string DM_PATH = "DMQueue"; 
    public static string PROJECT_PATH = "MSQueue"; 
} 


class Program 
{ 
    static void Main(string[] args) 
    { 
     string moomoo = LocalConstants.PROJECT_PATH; 

     Console.WriteLine(moomoo); 
    } 
} 

funziona per me.

[Edit 2 - Fro coloro che verranno dopo]

Sembra The type initializer for ‘SomeClass’ threw an exception può essere un caso in cui

Ma quando si chiama dal progettista WPF, l ' "applicazione" è Visual Studio, che (presumibilmente) non ha le stringhe di connessione appropriate nella sua.file di configurazione;

La correzione per questo autore era:

spostare l'istanza del mio Entity Data Model in una proprietà

+0

Qualche suggerimento su un modo migliore per avvicinarsi a questo? –

+0

@NickLaMarca Perché non ti piace 'string moomoo = ConfigurationManager.AppSettings [" MSQueue "];'? Cosa stai cercando di ottenere con la tua classe 'LocalConstants'? –

+0

Il requisito non è stringhe magiche o riferimenti a ConfigurationManager nel codice. Volevo tutto in 1 file. Ho appena preso tutte le stringhe nel ConfigurationManager e le ho inserite direttamente nella classe LocalConstants e lanciasse comunque un'eccezione e restituendo null –

0

Si potrebbe provare a fare loro readonly

public static readonly string PROJECT_PATH = ConfigurationManager.AppSettings["MSQueue"]; 

readonly i campi possono essere pigri-caricati

+0

sfortunatamente questo non funziona –

0

Perché non provare qualcosa di simile:

public static string ProjectPath 
    { 
     get 
     { 
      return ConfigurationManager.AppSettings["MSQueue"]; 
     } 
    } 
+0

Fornisci una descrizione/spiegazione dello snippet di codice. –

Problemi correlati