ASP.Net y GetType ()

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

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

En mi estructura de proyecto, tengo un archivo de recursos predeterminado y un archivo de recursos de traducción psuedo. 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 por adelantado!

6

4 Respuestas

Si su código al lado se ve así:

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

Luego obtendría el objeto Type para ello con typeof (_Login) . Para obtener el tipo de forma dinámica, puede encontrarlo recursivamente:

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

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

Después de algunas investigaciones adicionales encontré que si llamo a Page.GetType (). BaseType devuelve el tipo de código subyacente de la página Aspx.

3
agregado

page.GetType (). BaseType, se ha dicho antes, pero déjame explicar en detalle por qué.

Las 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

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

Esto permite que su código 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.

1
agregado

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 el uso de 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 del 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.

0
agregado