2008-10-14 15 views
6

Ich möchte einen Typ eines "BasePage" -Objekts, das ich erstelle, erhalten. Jedes Page-Objekt basiert auf BasePage. Zum Beispiel habe ich einen Login.aspx und in meiner Code-Behind und eine Klasse, die eine Methode Display hat:ASP.Net und GetType()

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

In meiner Projektstruktur habe ich eine Standard-Ressource-Datei und eine Pseudo-Übersetzung Ressourcendatei. Wenn ich versuche versuche so etwas:

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

es gibt die übersetzte Seite zurück. Nach einigen Nachforschungen fand ich, dass page.GetType(). ToString() etwas zurückgegeben hat, um die Wirkung von "ASP_login.aspx" Wie bekomme ich den eigentlichen Code hinter Klassentyp, so dass ich ein Objekt vom Typ "Login" das ist abgeleitet von "BasePage"?

Vielen Dank im Voraus!

Antwort

6

Wenn Ihr Code-beside sieht wie folgt aus:

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

Dann würden Sie die Type Objekt für sie mit typeof(_Login) bekommen. Um den Typ dynamisch zu erhalten, können Sie es rekursiv finden:

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

Es hängt davon ab, wo Sie Display() aus aufrufen. Wenn Sie es aus dem ASPX aufrufen, dann werden Sie "ASP_login.aspx". Wenn Sie es über die Code-Behind-Methode aufrufen (z. B. die Page_Load() -Methode), sollten Sie den Anmeldeseitentyp erhalten.

Anstatt die Seite zu übergeben, könnten Sie nur die Page-Eigenschaft (d. H. This.Page.GetType()) verwenden, die immer der aktuelle Page/Codebehind-Typ sein sollte, wenn ich mich richtig erinnere.

Ich sollte auch darauf hinweisen, dass Sie möglicherweise diese Art von Sachen aus dem ASPX/Codebehind und in eine Art von Service verschieben. Es ist im Allgemeinen eine gute Idee, die Menge an Dingen, die Sie in einem Code hinter sich lassen, zu minimieren und statt dessen Logik in eine Presenter-Klasse zu schieben und dem MVP-Muster für die Entwicklung von ASP.NET Web Forms zu folgen.

3

Nach einigen weiteren Studien fand ich, dass, wenn ich Page.GetType() aufrufen Basetype es den Code-behind gibt Typ der Aspx-Seite..

1

page.GetType(). BaseType, das ist schon mal gesagt worden, aber lassen Sie mich näher erläutern, warum.

Aspx Seiten erben von ihren Code-Behind-Seiten, was bedeutet, dass die Vererbungshierarchie wie folgt aussieht:

... 
Page 
BasePage 
Login 
ASP_Login 

Wo die Spitze der Eltern ist und der Boden ist das Kind.

Dies ermöglicht den Zugriff auf Ihren Code von der aspx-Seite aus, ohne dass der generierte Code für Ihre aktuelle aspx-Seite in die Basisklassenseite kopiert werden muss.

Verwandte Themen