Code never lies!


                                                   -- iret

导航

How To: 屏蔽组件 Design-time 显示的属性以及方法

Posted on 2005-07-06 12:04  iret  阅读(2330)  评论(3编辑  收藏  举报
所谓屏蔽组件 design-time 显示的属性以及方法,是指把组件的某些属性甚至方法对.Net Studio IDE 的 design-time 支持给屏蔽掉。使得从用户的 IDE 看来,该组件是好像并非存在这个属性,或者方法。 但事实上,这个属性或者方法是的确存在于组件中的,只是出于设计上的考虑,我们把它给屏蔽掉了。 
    
    这里所谓的屏蔽原因一般而言,有以下一些:
    1) 屏蔽祖先类中不需要的属性。 
        通常编写组件,我们一般都会从 usecontrol 类, 或者webcontrol 类通过继承创建,甚至很多的情况下是继承类库中处于下游的组件类,button, textbox 等已有的工具类。 祖先已有的属性和方法被继承下来,从而减少了大量重复的编码。 选择一个好的祖先类,我们就获得了一个很好的起点。 
    However, the sword always has two blades. 在从祖先类中获得了我们想要获得属性和方法外,继承也强迫我们接受了某些我们不想要的祖先类的方法和属性。 而且如果这些属性会对用户使用有负作用的暗示或者影响,或者和我们的一些自定义属性有语义冲突,我们就必须考虑把它们屏蔽掉。
    
    2) 一些过时的属性或者方法。 
        例如,由于向下兼容的需要,我们不能把某些过时的属性或者方法去掉,所以把它屏蔽掉,让用户使用新的属性或者方法作为替代。

    3) 一些属性不适合于显示在设计时的IDE 属性窗口。

    在编写 .Net Component 的时候,如何添加 design-time 的多语言支持呢? 下面我们分别对以上的几种情况分别作阐述。
    首先是如何屏蔽基类的公用属性或者方法。大概有两种途径可以做到:
    1) 重载父类的属性,然后使用EditorBrowsable以及Browsable属性标记:
    例如,为了屏蔽基类的BackgroundImage属性,我们可以首先在子类中重载,然后为子类的BackgroundImage添加EditorBrowsable以及Browsable属性标记。
[EditorBrowsable(EditorBrowsableState.Never), Browsable(false)]  
    
public override Image BackgroundImage  
    
{  
        
get  
        
{  
            
return base.BackgroundImage;  
        }
  
        
set  
        
{  
            
base.BackgroundImage = value;  
        }
  
    }
  
    
    EditorBrowsable(EditorBrowsableState.Never),  指示隐藏显示在智能编辑提示功能intelliSense;Browsable(false),指示隐藏显示在IDE控件属性页面。
    
    另外的一些情况,例如隐藏一些设计时不可见的属性,Browsable(false)也经常会被独立使用。

    2) 为控件编写一个designer, 在designer里面的PostFilterProperties方法中过滤掉不想要的属性。
[Designer(typeof (MyDesigner))] 
 
public sealed class MyControl: System.Web.UI.WebControls.WebControl {} 

public class MyDesigner:System.Web.UI.Design.ControlDesigner 
    { 
        
public MyDesigner() 
        {} 
 
        
protected override void PostFilterProperties( IDictionary Properties ) 
        { 
            Properties.Remove( 
"BackgroundImage" ); 
         } 
 
    } 
    最后使用Obsolete属性标记,标识过时的属性或者方法。为了向下兼容的考虑,对一些过时的属性和方法,我们不能够直接从控件中删除,尤其是一个广为发布的控件。那么怎么告诉用户这些方法是过时的呢?我们可以在控件中使用Obsolete属性标记。
    例如:
public class MyControl:System.Web.UI.WebControls.WebControl 

[Obsolete(
"NewItemStyle property instead.")] 
public TableItemStyle ItemStyle 

  
get {} 
  
set {} 


    用户如果使用了ItemStyle属性,在编辑器里面就会有波浪线提示,而且会产生一个编译时间的warning信息,提示用户使用了一个标记为过期的属性。但是这不会造成旧用户原有代码的任何问题。