2009-08-27 20 views
5

Ich habe die folgende Klasse bekommt:Get Wert von statischem Feld

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

Ich weiß, ich Pages.Home statisch verwenden kann, aber es gibt einen Grund für meine Frage.

Ich möchte eine Methode haben, die ich so nennen kann:

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

usw.

C'est möglich?

Danke, Dave

+0

By the way, Sie * wirklich * sollten diese Felder 'readonly' oder Nutzung markieren Nur-Lese-Eigenschaften. –

+2

... oder 'const' Strings –

+0

' const' sollte möglichst vermieden werden, da die Werte nicht runtime-constant, sondern compiletime sind. Wenn Sie private 'const'-Felder verwenden, sollte dies kein Problem sein. Wenn Sie jedoch auf eine Assembly verweisen und' const'-Felder einer der Klassen in der Assembly verwenden, wird der Wert durch den Literalwert von 'const ersetzt 'Feld. Wenn Sie jetzt den Wert ändern und nur die referenzierte Assembly ersetzen, ohne die referenzierende Assembly erneut zu kompilieren, verbleibt der alte Wert in der referenzierenden Assembly, was höchstwahrscheinlich zu einem unerwünschten Verhalten führt. –

Antwort

16

Sie folgende verwenden:

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

danke, das ist perfekt. –

1

Nur ... wenn Sie Literale verwenden werden ("Home"), dann würde ich absolut binden die const, dh Pages.Home (sie sollten wahrscheinlich im angegebenen Beispiel Konstanten sein). Die Reflexion Ansatz könnte nützlich sein, wenn Sie:

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

Wenn Sie Schalter auf const tun , dann beachten Sie, dass sie als statische Felder manifestieren:

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

Wenn es verwendet wird, stark könnten Sie auch Cache diese in einem Wörterbuch.

4

Sie können es tun, wie Konrad vorgeschlagen Reflexion verwenden. Aber ich würde es viel besser finden, ein Wörterbuch zu benutzen und sich nicht auf die Reflexion für eine solche Aufgabe zu verlassen.

Sie sollten die Fehlerbehandlung natürlich Ihren tatsächlichen Anforderungen anpassen.

+0

Da seine ursprüngliche Klasse die drei Seiteneigenschaften fest codiert hat, könnte er eine Enumeration dieser Werte als Schlüssel im Pages-Wörterbuch verwenden. hilft Tippfehler zu vermeiden. –

+0

Guter Punkt, wenn die Seitensammlung statisch ist (wie der Originalcode vermuten lässt). –

0

Wie andere gesagt haben, würde ich hier Reflexion vermeiden. Auch, obwohl es ein bisschen mehr Code fügt, eine ENUM für die fest codierten Seitennamen ist auch eine gute Idee (auch bereits vorgeschlagen)

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]; 
    }