ASP.Net和GetType()

时间:2008-10-14 17:26:30

标签: c# asp.net reflection resourcemanager

我想获得一种我正在创建的“BasePage”对象。每个Page对象都基于BasePage。例如,我有一个Login.aspx和我的代码隐藏以及一个具有方法显示的类:

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

在我的项目结构中,我有一个默认资源文件和一个伪翻译资源文件。如果我尝试尝试这样的事情:

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

它返回翻译的页面。经过一些研究后,我发现page.GetType()。ToString()返回了“ASP_login.aspx”的效果。如何获取类类型后面的实际代码,这样我就得到一个类型为“Login”的对象,即派生自“BasePage”?

提前致谢!

4 个答案:

答案 0 :(得分:6)

如果您的代码旁边看起来像这样:

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);
 }

答案 1 :(得分:3)

经过一些额外的研究后,我发现如果我调用Page.GetType()。BaseType,它会返回Aspx页面的代码隐藏类型。

答案 2 :(得分:1)

page.GetType()。BaseType,之前已经说过,但让我详细说明原因。

Aspx页面继承自其代码隐藏页面,这意味着继承层次结构如下所示:

...
Page
BasePage
Login
ASP_Login

顶部是父级,底部是孩子。

这允许从aspx页面访问您的代码,而不需要将与您的实际aspx页面相关的所有生成代码复制到基类页面。

答案 3 :(得分:0)

这取决于你从哪里调用Display()。如果你是从ASPX调用它,那么你将使用“ASP_login.aspx”。如果你是从代码隐藏(即Page_Load()方法)调用它,你应该得到登录页面类型。

如果我没记错的话,你可以考虑使用Page属性(即this.Page.GetType())而不是传递Page in,如果我没记错的话,它应该始终是当前的页面/代码隐藏类型。

我还应该指出,你可以考虑将这种东西从ASPX / codebehind中移出并进入某种服务。通常最好尽量减少在后面的代码中执行的操作的数量,而是将逻辑推入到演示者类中,并遵循ASP.NET Web窗体开发的MVP模式。