2009-08-27 14 views
5

Mam następujące klasy:Get pola statycznego

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

wiem, że mogę używać Pages.Home statycznie, ale nie jest to powód do mojego pytania.

chcę mieć metodę, że mogę nazwać tak:

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

itp

C'est możliwe?

Dzięki, Dave

+0

By the way, you * naprawdę * Należy zaznaczyć te pola 'readonly' lub wykorzystanie służą tylko do odczytu. –

+2

... lub 'const' stringi –

+0

' const' należy unikać, jeśli to możliwe, ponieważ wartości nie są stałą runtime, ale kompilacja. Jeśli używasz prywatnych pól 'const' nie powinno to stanowić problemu, ale jeśli odwołujesz się do zespołu i używasz pól' const' jednej z klas w złożeniu, wartość jest zastępowana przez literalną wartość 'const 'pole. Jeśli teraz zmienisz wartość i po prostu zastąpisz zestaw referencyjny bez ponownej kompilacji zespołu referencyjnego, stara wartość pozostanie w zespole odniesienia, co najprawdopodobniej doprowadzi do niepożądanego zachowania. –

Odpowiedz

16

można wykorzystywać następujące:

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

dzięki, to jest idealne. –

1

tylko moja Tuppence ... jeśli masz zamiar używać literały ("Start"), to ja absolutnie wiązać const, tj. Pages.Home (w podanym przykładzie powinny to być stałe). Podejście odbicie może być przydatny, jeśli masz:

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

Jeśli zrobić przełącznik const, następnie uwagę, że przejawiają one pól jako statycznych:

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

Jeśli jest używany intensywnie mogłeś również przechowuj je w słowniku.

4

Możesz to zrobić tak, jak sugerował Konrad używając refleksji. Uznałbym jednak, że o wiele lepiej jest używać słownika i nie polegać na refleksji na takie zadanie.

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."); 
     } 
    } 
} 

Oczywiście należy dostosować obsługę błędów do rzeczywistych wymagań.

+0

ponieważ jego oryginalna klasa zakodowała właściwości trzech stron, wtedy mógł użyć wyliczenia tych wartości jako kluczy w słowniku Pages. pomaga uniknąć literówek. –

+0

Dobrze, jeśli kolekcja stron jest statyczna (jak sugeruje oryginalny kod). –

0

Jak powiedzieli inni, nie użyłbym tutaj refleksji. Również, chociaż to dodaje trochę więcej kodu, enum dla zakodowanych nazw stron to również dobry pomysł (również sugerowane wcześniej)

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]; 
    } 
Powiązane problemy