2009-08-27 12 views
5

私は以下のクラスを持っている:取得値

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

私は静的Pages.Homeを使用することができます知っているが、私の質問のための理由があります。

私は、このように呼び出すことができる方法をご希望:可能C'EST

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

など

を?

おかげで、 デイブ

+0

です読み取り専用のプロパティを使用します。 –

+2

...または 'const'文字列 –

+0

' const'は、実行時定数ではなくコンパイル時には可能な限り避けてください。プライベート 'const'フィールドを使用している場合、これは問題ではありませんが、アセンブリを参照していて、アセンブリのクラスのうちの1つの' const'フィールドを使用すると、その値は 'const 'フィールド。値を変更して、参照アセンブリを再コンパイルせずに参照アセンブリを置き換えるだけでは、参照アセンブリ内に古い値が残るため、望ましくない動作が発生する可能性が高くなります。 –

答えて

16

あなたは以下のように使用することができます。

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

ありがとう、それは完璧です。 –

1

ちょうど私tuppence ...あなたはリテラル(「ホーム」)を使用しようとしている場合は、その後、私は絶対に結合しますconst、すなわちPages.Home(これらはおそらく与えられた例では定数です)。あなたが持っている場合は、反射アプローチが便利かもしれません:

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

あなたは、その後、constにスイッチを行う場合、それらは、静的フィールドが現れていることに注意してください:

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

それはあなたがまた頻繁に可能性が使用されている場合これらを辞書にキャッシュする。

4

あなたは反射を使用して提案されたコンラッドのようにすることができます。しかし、辞書を使い、そのような作業のためのリフレクションに頼るのではなく、もっと良いデザインと考えています。

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

もちろん、実際の要件に合わせてエラー処理を調整する必要があります。

+0

元のクラスは3つのページのプロパティをハードコードしていたので、それらの値の列挙をPages辞書のキーとして使用することができました。タイプミスを防ぐのに役立ちます。 –

+0

ページコレクションが静的な場合(元のコードが示唆しているように)、良い点です。 –

0

他にも述べたように、ここでは反射を避けることにします。それは少しより多くのコード、ハードコードされたページ名の列挙型を追加しますが、また、あなたが*本当に*これらのフィールド `readonly`または使用をマークする必要があり、また、(また、以前に示唆した)良いアイデアところで

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