焦头烂额!
FontInfo的属性如何扩展成子属性显示啊?搞了一天了还没搞定,什么方法都试过了,看不到WebControl的代码,否则早就搞定了,继续,搞定了再来写。
打了一会游戏,上网一搜就搜到了,之前用Reflecter都不行,还好有人遇到过这个问题
}
打了一会游戏,上网一搜就搜到了,之前用Reflecter都不行,还好有人遇到过这个问题
今日在开发asp.net web control的时候, 我给控件设置了一个FontInfo属性, 然后编译, 测试.发现一个问题:
我开始的代码是这样写的
[Category("Appearance")]
public FontInfo TitleFont
{
get
{
object savedState = ViewState["titlefont2"];
return (savedState == null)? null : (FontInfo)savedState;
}
set
{
ViewState["titlefont2"] = value;
}
}
public FontInfo TitleFont
{
get
{
object savedState = ViewState["titlefont2"];
return (savedState == null)? null : (FontInfo)savedState;
}
set
{
ViewState["titlefont2"] = value;
}
}
结果在属性浏览器上这个属性不能展开, 你只要看看其他有这个属性的web控件就知道, 这个属性在浏览器上是可以展开的. 其实原因很简单, 就是 return (savedState == null)? null : (FontInfo)savedState;
这一句在设计时返回的是null, 看来vs也不够完美,就算我返回的是null也不能无视它的类型嘛...
这一句在设计时返回的是null, 看来vs也不够完美,就算我返回的是null也不能无视它的类型嘛...
于是产生了看看ms是怎么写这个属性的.(在此申明,解决以上问题只要返回不是null即刻, 这里只是好奇ms是怎么返回的)
于是打开IL DASM, 打开System.DLL,找到WebControl, 打开Font属性的中间代码:
.property instance class System.Web.UI.WebControls.FontInfo
Font()
{
.custom instance void System.Web.WebCategoryAttribute::.ctor(string) = ( 01 00 0A 41 70 70 65 61 72 61 6E 63 65 00 00 ) // ...Appearance..
.custom instance void [System]System.ComponentModel.DesignerSerializationVisibilityAttribute::.ctor(valuetype [System]System.ComponentModel.DesignerSerializationVisibility) = ( 01 00 02 00 00 00 00 00 )
.custom instance void [System]System.ComponentModel.NotifyParentPropertyAttribute::.ctor(bool) = ( 01 00 01 00 00 )
.custom instance void [System]System.ComponentModel.DefaultValueAttribute::.ctor(string) = ( 01 00 FF 00 00 )
.custom instance void System.Web.WebSysDescriptionAttribute::.ctor(string) = ( 01 00 0F 57 65 62 43 6F 6E 74 72 6F 6C 5F 46 6F // ...WebControl_Fo
6E 74 00 00 ) // nt..
.get instance class System.Web.UI.WebControls.FontInfo System.Web.UI.WebControls.WebControl::get_Font()
} // end of property WebControl::Font
Font()
{
.custom instance void System.Web.WebCategoryAttribute::.ctor(string) = ( 01 00 0A 41 70 70 65 61 72 61 6E 63 65 00 00 ) // ...Appearance..
.custom instance void [System]System.ComponentModel.DesignerSerializationVisibilityAttribute::.ctor(valuetype [System]System.ComponentModel.DesignerSerializationVisibility) = ( 01 00 02 00 00 00 00 00 )
.custom instance void [System]System.ComponentModel.NotifyParentPropertyAttribute::.ctor(bool) = ( 01 00 01 00 00 )
.custom instance void [System]System.ComponentModel.DefaultValueAttribute::.ctor(string) = ( 01 00 FF 00 00 )
.custom instance void System.Web.WebSysDescriptionAttribute::.ctor(string) = ( 01 00 0F 57 65 62 43 6F 6E 74 72 6F 6C 5F 46 6F // ...WebControl_Fo
6E 74 00 00 ) // nt..
.get instance class System.Web.UI.WebControls.FontInfo System.Web.UI.WebControls.WebControl::get_Font()
} // end of property WebControl::Font
发现它这里用了三个Attribute类, 开始我还以为是我没有用这几个Attribute,于是,我也加上了同样的Attribute,发现仍然如此.继续看他的中间码:
.get instance class System.Web.UI.WebControls.FontInfo System.Web.UI.WebControls.WebControl::get_Font()
发现这个Font属性是readonly的, 很奇怪阿, 于是我也把我的属性中的set方法去了,当然还是不行,这个并不是问题的实质, 看来问题出在get方法上了(当时并没有想到返回null会让浏览器无视之......)
发现这个Font属性是readonly的, 很奇怪阿, 于是我也把我的属性中的set方法去了,当然还是不行,这个并不是问题的实质, 看来问题出在get方法上了(当时并没有想到返回null会让浏览器无视之......)
于是用ILDASM打开get_font()方法:
{
// 代码大小 12 (0xc)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance class System.Web.UI.WebControls.Style System.Web.UI.WebControls.WebControl::get_ControlStyle()
IL_0006: callvirt instance class System.Web.UI.WebControls.FontInfo System.Web.UI.WebControls.Style::get_Font()
IL_000b: ret
} // end of method WebControl::get_Font
// 代码大小 12 (0xc)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance class System.Web.UI.WebControls.Style System.Web.UI.WebControls.WebControl::get_ControlStyle()
IL_0006: callvirt instance class System.Web.UI.WebControls.FontInfo System.Web.UI.WebControls.Style::get_Font()
IL_000b: ret
} // end of method WebControl::get_Font
原来ms是实例化了一个Style类, 然后返回Style.Font作为Font属性, 这些明白了,修改我的属性如下:
private Style _rowStyle;
[Category("Appearance")]
[NotifyParentProperty(true),DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public FontInfo RowFont
{
get
{
if (_rowStyle == null)
{
_rowStyle = new Style();
if (IsTrackingViewState)
{
((IStateManager)_rowStyle).TrackViewState();
}
}
return _rowStyle.Font;
}
[Category("Appearance")]
[NotifyParentProperty(true),DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public FontInfo RowFont
{
get
{
if (_rowStyle == null)
{
_rowStyle = new Style();
if (IsTrackingViewState)
{
((IStateManager)_rowStyle).TrackViewState();
}
}
return _rowStyle.Font;
}
}
一切ok!
posted on 2006-03-01 21:08 ............. 阅读(159) 评论(0) 收藏 举报
浙公网安备 33010602011771号