• [你必须知道的.NET]第三十四回,object成员,不见了!


    anytao.net | 《你必须知道的.NET》网站 | Anytao技术博客 

    发布日期:2009.10.30 作者:Anytao
    © 2009 Anytao.com ,Anytao原创作品,转贴请注明作者和出处。

    在.NET世界了,object是公认的造物主,其麾下的7大成员,个顶个的横行在任何系统的任何代码角落。

    public class Object
    {
        public Object();
        public virtual bool Equals(object obj);
        public static bool Equals(object objA, object objB);
        public virtual int GetHashCode();
        public Type GetType();
        protected object MemberwiseClone();
        public static bool ReferenceEquals(object objA, object objB);
        public virtual string ToString();
    }

    关于object的故事,有很多很多。而今天的故事则着眼于“为熟悉的朋友做点儿不熟悉的事儿”。相信吗?我的Object成员不见了,不信你可以欣赏一下消失了的object成员。

    o_anytao-insidenet-34-01[1]

    哈哈!清新多了吧,比起下面常见的编码方式:

    o_anytao-insidenet-34-02[1]

    是不是让人不知所挫。大概说来,任何时候,在长长的成员方法列表中,你总能看到他们的身影,谁让object是万物的基类呢?不过,有些时候,我可能希望眼根清净,屏蔽掉不会使用的父类成员,使得方法调用变得更加简洁,就像上面的IObject成员一样。

    那么这一切是如何做到的呢?虽然我是一个诚实的人,但是其实这是一次赤裸裸的欺骗,而行骗的家伙就是将要闪亮登场的:

    namespace System.ComponentModel
    {
        [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Interface | AttributeTargets.Delegate)]
        public sealed class EditorBrowsableAttribute : Attribute
        {
        }
    }

    是的,正是System.CompentModel.EditorBrowsableAttriute。以上例而言,我其实为AnyObject类实现了下面的编码:

    public interface IObject : IAnyObject
    {
        void About();
    }
    public class AnyObject : IObject
    {
        public void About()
        {
        }
    }

    其中的核心在于IAnyObject的定义:

    namespace Anytao.Core.Common
    {
        /// <summary>
        /// A common interface for any object
        /// </summary>
        [EditorBrowsable(EditorBrowsableState.Never)]
        public interface IAnyObject
        {
            [EditorBrowsable(EditorBrowsableState.Never)]
            bool Equals(object obj);
    
            [EditorBrowsable(EditorBrowsableState.Never)]
            int GetHashCode();
    
            [EditorBrowsable(EditorBrowsableState.Never)]
            Type GetType();
    
            [EditorBrowsable(EditorBrowsableState.Never)]
            string ToString();
        }
    }

    在通常的情况下,我的Anytao.Core.Common基础组件中都提供一个通用的IAnyObject接口,该接口的作用就是将object成员魔术般的隐藏掉,就如同本文开始的IObject一样。

    所以,我们回到System.CompentModel.EditorBrowsableAttriute特性,就可以了解到其作用就是:标识一个类或者属性在编辑器中的可见性。
    那么,难道他们真的消失了吗?继续应用一开始的代码:
    class Program
    {
        static void Main(string[] args)
        {
            IObject obj = new AnyObject();
    
            Console.WriteLine(obj.ToString());
        }
    }

    我们发现虽然ToString对obj是不可见的,但是运行时调用仍然没有问题,所以,总体说来System.ComponentModel.EditorBrowsableAttribute只是一个障眼法,在此实现了对Visual Studio智能感知的控制。其中EditorBrowsableState选项主要包括了:

    • Advanced,针对高级成员的选项设置,同样的方式可以应用Visual Studio的Options->Text Editor->C#->General的Hide advanced members设置。
    • Always,总是可见。
    • Never,总是不可见。

    注意:在Visual C#中,EditorBrowsableAttribute并不对同一程序集的成员有效。

    还等什么?也去试试吧?另外关于编辑器,还有很多好玩的特性值得挖掘,贵在发现的力量。

    参考文献

    更多闲言碎语,关注anytao.net

    anytao | © 2009 Anytao.com

    2009/10/30 | http://anytao.cnblogs.com/ | http://www.anytao.net/blog/post/2009/10/29/anytao-insidenet-34-object-members-hide.aspx

    本文以“现状”提供且没有任何担保,同时也没有授予任何权利。 | This posting is provided "AS IS" with no warranties, and confers no rights.

    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    性能优化之
    gruntjs开发实例
    从数组里随机获取N项
    调试工具-fiddler:本地资源替换线上调试
    HTML5-canvas实例:2D折线数据图与2D扇形图
    移动前端兼容性笔记
    Less开发指南(三)- 代码文件跟踪调试
    像纸质笔记本一样给div,textarea添加行的分割线
    基于视图的增删改查操作(颠覆传统思维吧)
    恶劣的百度推广人员
  • 原文地址:https://www.cnblogs.com/anytao/p/must_net_34.html
Copyright © 2020-2023  润新知