ASP.Net e GetType ()

Eu quero obter um tipo de um objeto "BasePage" que estou criando. Cada objeto de página é baseado em BasePage. Por exemplo, eu tenho um Login.aspx e no meu code-behind e uma classe que tem um método de exibição:

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

Na estrutura do meu projeto, eu tenho um arquivo de recursos padrão e um arquivo de recursos de tradução do psuedo. Se eu definir tente algo como isto:

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

devolve a página traduzida. Depois de alguma pesquisa eu descobri que page.GetType (). ToString() retornou algo para o efeito de "ASP_login.aspx" Como posso obter o código real por trás do tipo de classe, de modo que recebo um objeto do tipo "Login" derivado de "BasePage"?

Desde já, obrigado!

6

4 Respostas

Se o seu código ao lado se parece com isso:

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

Então você obteria o objeto Type para ele com typeof (_Login) . Para obter o tipo dinamicamente, você pode encontrá-lo recursivamente:

Type GetCodeBehindType()
 { return getCodeBehindTypeRecursive(this.GetType());
 }

Type getCodeBehindTypeRecursive(Type t)
 { var baseType = t.BaseType;
   if (baseType == typeof(BasePage)) return t;
   else return getCodeBehindTypeRecursive(baseType);
 }
6
adicionado

Após algumas pesquisas adicionais, descobri que, se eu chamo Page.GetType (). BaseType, ele retorna o tipo code-behind da página Aspx.

3
adicionado

page.GetType (). BaseType, já foi dito antes, mas deixe-me explicar o porquê.

As páginas Aspx herdam de suas páginas de código, significando que a hierarquia de herança é semelhante a:

...
Page
BasePage
Login
ASP_Login

Onde o topo é o pai e o fundo é o filho.

Isso permite que seu código fique acessível a partir da página aspx, sem exigir que todo o código gerado relacionado à sua página aspx real seja copiado para a página da classe base.

1
adicionado

Depende de onde você está chamando Display() de. Se você está chamando do ASPX, então você verá "ASP_login.aspx". Se você está chamando a partir do code-behind (ou seja, o método Page_Load ()), você deve obter o tipo de página Login.

Em vez de passar o Page in, você pode considerar apenas usar a propriedade Page (ou seja, this.Page.GetType ()), que deve ser sempre o tipo atual de página/code-behind, se bem me lembro.

Eu também devo deixar claro que você pode considerar mudar esse tipo de coisa do ASPX/code-behind e para algum tipo de serviço. Geralmente, é uma boa ideia minimizar a quantidade de coisas que você faz em um código por trás e, em vez disso, inserir a lógica em uma classe de apresentador e seguir o padrão MVP para o desenvolvimento de formulários da Web do ASP.NET.

0
adicionado