您的位置:首页 > 编程语言

一个VS.net自动生成代码引发的问题

2005-11-11 22:24 761 查看
最近在用C#写个项目,其中有的页面要从一个页面基类继承该类生成页面。但是该基类是项目组中一个朋友写的。在继承该类生成页面是发生了“指定的转换无效”无效的错误,由于我的页面代码部分自以为没有错(因为在没有继承该页面基类之前编译运行没有问题),看了好久都没发现问题,第二天问基类的作者,他说会不会是VS反射机制出了问题,我也搞不清楚了。只是知道我的继承页面的代码部分一句是用到两个强制类型转换:一个基类中实例化的类和(int),开始以为问题出在这上面。

但是,查了网上一些资料,包括博客堂里关于“指定的转换无效”方面的文章还是没有找到原因。

后来,看了看页面基类的内容,我发现我在继承页面上强制类型转换的同时还要用到基类中使用的一个类。好在他给我继承页面基类而来的两个页面都是没有问题的,只是他VS是英文版的。无意中看到它的页面中VS自动生成代码

override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
base.OnInit(e);
InitializeComponent();

}

中base.OnInit(e); InitializeComponent();的顺序与我的自动生成代码中的顺序正好相反。我把我的页面中的自动生成代码的相应代码顺序调整为与其一致。

base 关键字用于从派生类中访问基类的成员: 调用基类上已被其他方法重写的方法。 指定创建派生类实例时应调用的基类构造函数。

如果base.OnInit(e)没有在InitializeComponent()之前调用的话,所有页面基类Page_Load事件处理程序都将不会在当前继承页面上的Page_Load事件处理程序之前执行。这样的话,当前继承页面的Page_Load事件处理程序中如果用到页面基类的Page_Load事件处理程序中的实例化的类时,就会有出现问题,在我的这个项目中就体现在“指定的转换无效”上,不是由于(int)引起的。后来考虑做基类的朋友也是参考现成的代码,不应该英文版的就能在自动代码的生成顺序上就智能些吧。同时以后在继承页面基类时一定要注意修改自动生成代码,不知道VS2005里面是否改进了。

我做了一个简单的示例,两个类文件:一个页面基类BasePage.cs和一个AboutClass.cs,一个NewName.aspx继承于页面基类的页面。

通过改变自动生成代码base.OnInit(e),InitializeComponent()的顺序就会发现有以下两种不同结果。



图1



图2
demo程序下载:/Files/brinksman/Initialize.rar
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: