2009-08-27 14 views
5

tengo la clase siguiente:del campo estático

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

Sé que puedo utilizar Pages.Home estáticamente, pero hay una razón de mi pregunta.

Deseo tener un método que puedo llamar así:

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

etc.

C'est posible?

Gracias, de Dave

+0

Por cierto, que * realmente * Debe marcar estos campos 'readonly' o uso propiedades de solo lectura en su lugar. –

+2

... o 'const' strings –

+0

' const' debe evitarse, si es posible, ya que los valores no son constante en tiempo de ejecución, sino tiempo de compilación. Si está utilizando campos privados 'const', esto no debería ser un problema, pero si hace referencia a un ensamblado y usa los campos' const' de una de las clases del ensamblado, el valor se reemplaza por el valor literal de 'const 'campo. Si ahora cambia el valor y simplemente reemplaza el ensamblado al que se hace referencia sin volver a compilar el ensamblaje de referencia, el valor anterior permanece en el ensamblaje de referencia, lo que probablemente conduzca a un comportamiento no deseado. –

Respuesta

16

Usted puede utilizar el siguiente:

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

gracias, eso es perfecto. –

1

Sólo mi peniques ... si se va a utilizar literales ("Inicio"), entonces yo absolutamente unirse a const, es decir, Pages.Home (probablemente deberían ser constantes en el ejemplo dado). El enfoque de la reflexión podría ser útil si usted tiene:

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

Si hace interruptor para const, a continuación, tenga en cuenta que se manifiestan campos estáticos:

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

Si se utiliza en gran medida se podría también almacenarlos en caché en un diccionario.

4

Puede hacerlo como Konrad sugirió el uso de la reflexión. Pero consideraría mucho mejor diseñar un diccionario y no confiar en la reflexión para tal tarea.

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

Por supuesto, debe ajustar el manejo del error a sus necesidades reales.

+0

ya que su clase original codificaba las propiedades de las tres páginas, luego podría usar una enumeración de esos valores como claves en el diccionario de Pages. ayuda a evitar errores tipográficos –

+0

Buen punto si la colección de páginas es estática (como sugiere el código original). –

0

Como han dicho otros, evitaría usar la reflexión aquí. Además, aunque se añade un poco más código, una enumeración de los nombres de las páginas codificadas es también una buena idea (también sugerido anteriormente)

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