ASP.Net e gettype ()
-
03-07-2019 - |
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!
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.