Pergunta

Eu quero conseguir um tipo de um objeto "BasePage" que eu estou criando. objeto Cada página é baseado fora BasePage. Por exemplo, eu tenho um Login.aspx e no meu código-behind e uma classe que tem um display de método:

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

Na minha estrutura do projeto Eu tenho um arquivo de recurso padrão e um arquivo de recurso pseudo-tradução. Se eu definir tentar algo como isto:

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

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

Agradecemos antecipadamente!

Foi útil?

Solução

Se o seu código-lado parece com isso:

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

Então você teria que obter o objeto Type por isso com typeof(_Login) . Para obter o tipo dinamicamente, você pode encontrá-lo de forma recursiva:

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

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

Outras dicas

Depois de alguma pesquisa adicional, descobri que se eu chamar Page.GetType (). BaseType ele retorna o código-behind tipo de página aspx.

page.GetType (). BaseType, tem sido dito antes, mas deixe-me elaborar sobre o porquê.

páginas aspx herdar de seu código-behind páginas, o que significa que os olhares hierarquia de herança como esta:

...
Page
BasePage
Login
ASP_Login

Quando o topo é o pai e no fundo é a criança.

Isso permite que seu código por trás para ser acessível a partir da página aspx, sem a necessidade de todo o código gerado relacionada à sua página aspx real a ser copiado para a página classe de base.

Depende de onde você está chamando Display () a partir. Se você está chamando-a do ASPX, então you'llse "ASP_login.aspx". Se você está chamando-o a partir do código-behind (ou seja, o método Page_Load ()) você deve obter o tipo de página de login.

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

Eu também deveria fazer o ponto que você pode considerar mover esse tipo de coisa fora do ASPX / codebehind e em algum tipo de serviço. É geralmente uma boa idéia para minimizar a quantidade de coisas que você faz em um código por trás e, em vez disso, a lógica impulso para uma classe apresentador e seguir o padrão MVP para ASP.NET Web desenvolvimento Forms.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top