2008-10-14 6 views
6

Je veux obtenir un type d'objet "BasePage" que je crée. Chaque objet Page est basé sur BasePage. Par exemple, j'ai un Login.aspx et dans mon code-behind et une classe qui a une méthode d'affichage:ASP.Net et GetType()

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

Dans ma structure de projet, j'avoir un fichier de ressources par défaut et un fichier de ressources psuedo-traduction. Si je mets essayer quelque chose comme ceci:

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

il retourne la page traduite. Après quelques recherches, j'ai trouvé que page.GetType(). ToString() retourné quelque chose à l'effet de "ASP_login.aspx" Comment puis-je obtenir le code réel derrière le type de classe, de sorte que je reçois un objet de type "Login" qui est dérivé de "BasePage"?

Merci d'avance!

Répondre

6

Si votre code à côté ressemble à ceci:

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

Ensuite, vous obtiendrez l'objet Type pour avec typeof(_Login). Pour obtenir le type dynamique, vous pouvez le trouver récursive:

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

Cela dépend de l'endroit où vous appelez Display() from. Si vous l'appelez depuis l'ASPX, alors vous devrez "ASP_login.aspx". Si vous l'appelez à partir du code-behind (c'est-à-dire la méthode Page_Load()), vous devez obtenir le type de page de connexion. Au lieu de transmettre la page, vous pouvez utiliser la propriété Page (c'est-à-dire this.Page.GetType()) qui devrait toujours être le type actuel de page/codebehind, si je me souviens bien.

Je devrais également faire le point que vous pourriez envisager de déplacer ce genre de substance hors ASPX/codebehind et dans une sorte de service. C'est généralement une bonne idée de minimiser la quantité de choses que vous faites dans un code et, à la place, de pousser la logique dans une classe de présentateur et de suivre le modèle MVP pour le développement de ASP.NET Web Forms.

3

Après quelques recherches supplémentaires, je trouve que si je l'appelle Page.GetType() BaseType renvoie le code-behind type de la page ASPX..

1

page.GetType(). BaseType, il a été dit avant, mais permettez-moi d'expliquer pourquoi.

pages ASPX héritent de leurs pages de code-behind, ce qui signifie que la hiérarchie d'héritage ressemble à ceci:

... 
Page 
BasePage 
Login 
ASP_Login 

Si le haut est le parent et le fond est l'enfant.

Cela permet à votre code derrière d'être accessible à partir de la page aspx, sans que tout le code généré lié à votre page ASPX réelle soit copié dans la page de classe de base.