ASP.NetおよびGetType()
-
03-07-2019 - |
質問
" BasePage"のタイプを取得したい私が作成しているオブジェクト。すべてのPageオブジェクトはBasePageに基づいています。たとえば、Login.aspxがあり、コードビハインドとメソッドDisplayを持つクラスがあります:
Display(BasePage page) {
ResourceManager manager = new ResourceManager(page.GetType());
}
私のプロジェクト構造には、デフォルトのリソースファイルと疑似翻訳リソースファイルがあります。設定した場合、次のようなものを試してください:
Display(BasePage page) {
ResourceManager manager = new ResourceManager(typeof(Login));
}
翻訳されたページを返します。調査の結果、page.GetType()。ToString()が" ASP_login.aspx"の効果に何かを返すことがわかりました。クラス型の背後にある実際のコードを取得するにはどうすればよいですか?「ログイン」型のオブジェクトを取得するようにそれは「BasePage」から派生したものですか?
事前に感謝します!
解決
コードビサイドが次のようになっている場合:
public partial class _Login : BasePage
{ /* ... */
}
次に、 typeof(_Login)
で Type
オブジェクトを取得します。型を動的に取得するには、再帰的に検索できます。
Type GetCodeBehindType()
{ return getCodeBehindTypeRecursive(this.GetType());
}
Type getCodeBehindTypeRecursive(Type t)
{ var baseType = t.BaseType;
if (baseType == typeof(BasePage)) return t;
else return getCodeBehindTypeRecursive(baseType);
}
他のヒント
さらに調査した結果、Page.GetType()。BaseTypeを呼び出すと、Aspxページの分離コードタイプが返されることがわかりました。
page.GetType()。BaseType、以前に言われましたが、その理由について詳しく説明します。
Aspxページは分離コードページから継承します。つまり、継承階層は次のようになります。
...
Page
BasePage
Login
ASP_Login
上が親、下が子の場合。
これにより、実際のaspxページに関連するすべての生成コードを基本クラスページにコピーすることなく、aspxページからコードビハインドにアクセスできます。
Display()の呼び出し元に依存します。 ASPXから呼び出す場合は、" ASP_login.aspx"を使用します。コードビハインド(つまり、Page_Load()メソッド)から呼び出す場合は、ログインページタイプを取得する必要があります。
ページを渡すのではなく、Pageプロパティ(つまり、this.Page.GetType())を使用することを検討するかもしれません。
また、この種のものをASPX /コードビハインドから何らかのサービスに移行することを検討するかもしれないという点を指摘する必要があります。一般に、コードビハインドで行う操作の量を最小限に抑え、代わりにロジックをプレゼンタークラスにプッシュし、ASP.NET Webフォーム開発のMVPパターンに従うことをお勧めします。