ASP.Net и GetType()
-
03-07-2019 - |
Вопрос
Я хочу получить тип объекта "Базовая страница", который я создаю.Каждый объект страницы основан на базовой странице.Например, у меня есть Login.aspx и в моем коде-behind и класс, у которого есть метод Display:
Display(BasePage page) {
ResourceManager manager = new ResourceManager(page.GetType());
}
В структуре моего проекта у меня есть файл ресурсов по умолчанию и файл ресурсов псевдоперевода.Если я установлю, попробуйте что-то вроде этого:
Display(BasePage page) {
ResourceManager manager = new ResourceManager(typeof(Login));
}
он возвращает переведенную страницу.После некоторых исследований я нашел эту страницу.GetType().toString() вернул что-то с эффектом "ASP_login.aspx" Как я могу получить фактический код, стоящий за типом класса, такой, что я получу объект типа "Login", который является производным от "Базовой страницы"?
Заранее спасибо!
Решение
Если ваш код рядом выглядит примерно так:
public partial class _Login : BasePage
{ /* ... */
}
Тогда вы получили бы Type
возражайте против этого с помощью typeof(_Login)
.Чтобы получить тип динамически, вы можете найти его рекурсивно:
Type GetCodeBehindType()
{ return getCodeBehindTypeRecursive(this.GetType());
}
Type getCodeBehindTypeRecursive(Type t)
{ var baseType = t.BaseType;
if (baseType == typeof(BasePage)) return t;
else return getCodeBehindTypeRecursive(baseType);
}
Другие советы
После некоторых дополнительных исследований я обнаружил, что если я вызову Страницу.GetType().BaseType возвращает кодовый тип страницы Aspx.
Страница.GetType().BaseType, это было сказано ранее, но позвольте мне пояснить, почему.
Страницы Aspx наследуются от своих страниц с кодом, что означает, что иерархия наследования выглядит следующим образом:
...
Page
BasePage
Login
ASP_Login
Где верх - это родительский элемент, а низ - дочерний.
Это позволяет вашему исходному коду быть доступным со страницы aspx, не требуя копирования всего сгенерированного кода, связанного с вашей фактической страницей aspx, на страницу базового класса.
Это зависит от того, откуда вы вызываете Display().Если вы вызываете его из ASPX, то у вас будет "ASP_login.aspx".Если вы вызываете это из исходного кода (т.е.методом Page_Load() вы должны получить тип страницы входа в систему.
Вместо того чтобы передавать Страницу внутрь, вы могли бы рассмотреть возможность простого использования свойства Page (т. е.this.Page.GetType()) который всегда должен быть текущим типом страницы / codebehind, если я правильно помню.
Я должен также отметить, что вы могли бы рассмотреть возможность переноса такого рода материалов из ASPX / codebehind в какой-нибудь сервис.Это вообще хорошая идея, чтобы свести к минимуму количество вещей, которые вы делаете в коде, а вместо этого нажать логику в класс телеведущей и следовать шаблону MVP для веб ASP.NET формы развития.