• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

Stand By .NET

.NET & SQL Server
  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

焦头烂额!

    FontInfo的属性如何扩展成子属性显示啊?搞了一天了还没搞定,什么方法都试过了,看不到WebControl的代码,否则早就搞定了,继续,搞定了再来写。 

    打了一会游戏,上网一搜就搜到了,之前用Reflecter都不行,还好有人遇到过这个问题


利用IL DASM解惑一例
今日在开发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;
   }
  }
 
结果在属性浏览器上这个属性不能展开, 你只要看看其他有这个属性的web控件就知道, 这个属性在浏览器上是可以展开的. 其实原因很简单, 就是  return (savedState == null)?  null : (FontInfo)savedState;
   这一句在设计时返回的是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
 
发现它这里用了三个Attribute类, 开始我还以为是我没有用这几个Attribute,于是,我也加上了同样的Attribute,发现仍然如此.继续看他的中间码:
 .get instance class System.Web.UI.WebControls.FontInfo System.Web.UI.WebControls.WebControl::get_Font()
发现这个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
 
原来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;
   }
 
 
  }
一切ok!

posted on 2006-03-01 21:08  .............  阅读(159)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3