2008-10-14 25 views
6

Quiero obtener un tipo de objeto "BasePage" que estoy creando. Cada objeto de página se basa en BasePage. Por ejemplo, tengo una Login.aspx y en mi código subyacente y una clase que tiene un método de visualización:ASP.Net y GetType()

Display(BasePage page) { 
    ResourceManager manager = new ResourceManager(page.GetType()); 
} 

En mi estructura del proyecto tengo un archivo de recursos predeterminado y un archivo de recursos pseudo-traducción. Si configuro pruebe algo como esto:

Display(BasePage page) { 
    ResourceManager manager = new ResourceManager(typeof(Login)); 
} 

devuelve la página traducida. Después de algunas investigaciones encontré esa página. GetType(). ToString() devolvió algo con el efecto de "ASP_login.aspx" ¿Cómo puedo obtener el código real detrás del tipo de clase, de modo que obtengo un objeto de tipo "Login" que es derivado de "BasePage"?

¡Gracias de antemano!

Respuesta

6

Si su código-lado tiene el siguiente aspecto:

public partial class _Login : BasePage 
{ /* ... */ 
} 

allí tendría que obtener el objeto Type por ello con typeof(_Login). Para obtener el tipo de forma dinámica, se puede encontrar de forma recursiva:

Type GetCodeBehindType() 
{ return getCodeBehindTypeRecursive(this.GetType()); 
} 

Type getCodeBehindTypeRecursive(Type t) 
{ var baseType = t.BaseType; 
    if (baseType == typeof(BasePage)) return t; 
    else return getCodeBehindTypeRecursive(baseType); 
} 
0

Depende de dónde llame desde Display(). Si lo llamas desde ASPX, entonces "ASP_login.aspx". Si lo está llamando desde el código subyacente (es decir, el método Page_Load()), debe obtener el tipo de página de inicio de sesión.

En lugar de pasar la página, puede considerar simplemente usar la propiedad de página (es decir, this.Page.GetType()) que siempre debe ser el tipo de página/código subyacente actual, si no recuerdo mal.

También debo aclarar que podría considerar mover este tipo de cosas fuera de ASPX/codebehind y en algún tipo de servicio. En general, es una buena idea minimizar la cantidad de cosas que hace en un código y, en su lugar, insertar la lógica en una clase de presentador y seguir el patrón MVP para el desarrollo de formularios web ASP.NET.

3

Después de una investigación adicional me encontré con que si llamo Page.GetType() BaseType devuelve el código subyacente tipo de la página ASPX..

1

page.GetType(). BaseType, se ha dicho anteriormente, pero permítanme explicar por qué.

páginas Aspx heredan de sus páginas de código subyacente, lo que significa que la jerarquía de herencia se ve así:

... 
Page 
BasePage 
Login 
ASP_Login 

Cuando la parte superior es el padre y la parte inferior es el niño.

Esto permite que su código detrás sea accesible desde la página aspx, sin requerir que todo el código generado relacionado con su página aspx real se copie en la página de la clase base.