Domanda

Voglio ottenere un tipo di " BasePage " oggetto che sto creando. Ogni oggetto Page è basato su BasePage. Ad esempio, ho un Login.aspx e nel mio code-behind e una classe che ha un metodo Display:

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

Nella struttura del mio progetto ho un file di risorse predefinito e un file di risorse psuedo-translation. Se ho impostato provare qualcosa del genere:

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

restituisce la pagina tradotta. Dopo alcune ricerche ho scoperto che page.GetType (). ToString () ha restituito qualcosa all'effetto di " ASP_login.aspx " Come posso ottenere il codice effettivo dietro il tipo di classe, in modo tale da ottenere un oggetto di tipo " Login " che deriva da "BasePage"?

Grazie in anticipo!

È stato utile?

Soluzione

Se il tuo codice accanto appare così:

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

Quindi otterrai l'oggetto Type con typeof(_Login) . Per ottenere il tipo in modo dinamico, puoi trovarlo in modo ricorsivo:

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

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

Altri suggerimenti

Dopo alcune ricerche aggiuntive ho scoperto che se chiamo Page.GetType (). BaseType restituisce il tipo code-behind della pagina Aspx.

page.GetType (). BaseType, è stato detto prima, ma lasciatemi approfondire sul perché.

Le pagine Aspx ereditano dalle loro pagine code-behind, il che significa che la gerarchia dell'ereditarietà è simile alla seguente:

...
Page
BasePage
Login
ASP_Login

Dove la parte superiore è il genitore e la parte inferiore è il figlio.

Ciò consente al codice retrostante di essere accessibile dalla pagina aspx, senza richiedere che tutto il codice generato relativo alla pagina aspx effettiva sia copiato nella pagina della classe base.

Dipende da dove stai chiamando Display (). Se lo chiami da ASPX, allora vedrai " ASP_login.aspx " ;. Se lo chiami dal code-behind (ovvero il metodo Page_Load ()) dovresti ottenere il tipo di pagina di accesso.

Invece di passare la Pagina, potresti considerare di usare solo la proprietà Page (cioè this.Page.GetType ()) che dovrebbe sempre essere il tipo di pagina / codebehind corrente, se ricordo bene.

Dovrei anche sottolineare che potresti considerare di spostare questo tipo di cose fuori da ASPX / codebehind e in una sorta di servizio. In genere è una buona idea ridurre al minimo la quantità di operazioni eseguite in un codice e, invece, inserire la logica in una classe presentatore e seguire il modello MVP per lo sviluppo di ASP.NET Web Forms.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top