2009-08-27 18 views
5

Ho la seguente classe:Get di campo statico

public static class Pages 
{ 
    public static string LoggedOut = "LoggedOut.aspx"; 
    public static string Login = "Login.aspx"; 
    public static string Home = "Home.aspx"; 
} 

So che posso usare Pages.Home staticamente, ma c'è una ragione per la mia domanda.

Vorrei avere un metodo che posso chiamare in questo modo:

string pageName = Pages.GetPage("Home"); 

ecc

C'est possibile?

Grazie, Dave

+0

Tra l'altro, è * veramente * dovrebbe contrassegnare questi campi 'readonly' o l'uso invece proprietà di sola lettura. –

+2

... o 'const' stringhe –

+0

' const' dovrebbe essere evitato, se possibile, perché i valori non sono costanti di runtime, ma compiletime. Se si usano campi privati ​​'const' questo non dovrebbe essere un problema, ma se si fa riferimento a un assembly e si usano i campi' const' di una delle classi nell'assembly, il valore viene sostituito dal valore letterale di 'const 'campo. Se ora si modifica il valore e si sostituisce semplicemente l'assembly di riferimento senza ricompilare l'assembly di riferimento, il vecchio valore rimane nell'assembly di riferimento, che molto probabilmente porterà a un comportamento indesiderato. –

risposta

16

È possibile utilizzare il seguente:

var field = typeof(Pages).GetField("Home", BindingFlags.Public | BindingFlags.Static); 
var value = (string)field.GetValue(null); 
+0

grazie, è perfetto. –

1

Solo la mia tuppence ... se avete intenzione di usare letterali ("casa"), quindi vorrei assolutamente legarsi il const, ovvero Pages.Home (probabilmente dovrebbero essere costanti nell'esempio fornito). L'approccio di riflessione potrebbe essere utile se si dispone:

string s = ...something clever... 
string page = GetPage(s); 

Se fai interruttore per const, poi notare che si manifestano campi statici:

string s = ...something clever... 
FieldInfo field = typeof(Pages).GetField(s, 
    BindingFlags.Static | BindingFlags.Public); 
string page = (string)field.GetValue(null); 

Se viene usato pesantemente si potrebbe anche cache questi in un dizionario.

4

Puoi farlo come Konrad ha suggerito l'uso della riflessione. Ma considererei molto meglio il design per usare un dizionario e non fare affidamento sulla riflessione per un simile compito.

public static class Pages 
{ 
    private static readonly IDictionary<String, String> PageMap = null; 

    private static Pages() 
    { 
     Pages.PageMap = new Dictionary<String, String>(); 

     Pages.PageMap.Add("LoggedOut", "LoggedOut.aspx"); 
     Pages.PageMap.Add("Login", "Login.aspx"); 
     Pages.PageMap.Add("Home", "Home.aspx"); 
    } 

    public static GetPage(String pageCode) 
    { 
     String page; 
     if (Pages.PageMap.TryGet(pageCode, out page) 
     { 
      return page; 
     } 
     else 
     { 
      throw new ArgumentException("Page code not found."); 
     } 
    } 
} 

Si dovrebbe naturalmente regolare la gestione degli errori in base alle proprie esigenze.

+0

poiché la sua classe originale codificava le proprietà di tre pagine, quindi poteva usare un enum di quei valori come chiavi nel dizionario di Pages. aiuta ad evitare errori di battitura. –

+0

Un buon punto se la raccolta di pagine è statica (come suggerisce il codice originale). –

0

Come altri hanno già detto, eviterei di usare il riflesso qui. Inoltre, anche se si aggiunge un po 'più codice, un enum per i nomi delle pagine hardcoded è anche una buona idea (anche suggerito in precedenza)

public enum pages { LoggedOut, Login, Home } 

    static Dictionary<pages, string> pageDict = new Dictionary<pages, string>() { 
     {pages.Home, "Home.aspx"}, 
     {pages.Login, "Login.aspx"}, 
     {pages.LoggedOut, "LoggedOut.aspx"} 
    }; 

    public static string getPage(pages pageName) 
    { 
     return pageDict[pageName]; 
    } 
Problemi correlati