Вопрос

Я хочу получить тип объекта "Базовая страница", который я создаю.Каждый объект страницы основан на базовой странице.Например, у меня есть 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 формы развития.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top