艾伟_转载:[你必须知道的.NET】object成员,不见了!
2011-08-29 00:20
417 查看
在.NET世界了,object是公认的造物主,其麾下的7大成员,个顶个的横行在任何系统的任何代码角落。
[/code]
关于object的故事,有很多很多。而今天的故事则着眼于“为熟悉的朋友做点儿不熟悉的事儿”。相信吗?我的Object成员不见了,不信你可以欣赏一下消失了的object成员。
[3].png]
哈哈!清新多了吧,比起下面常见的编码方式:
[3].png]
是不是让人不知所挫。大概说来,任何时候,在长长的成员方法列表中,你总能看到他们的身影,谁让object是万物的基类呢?不过,有些时候,我可能希望眼根清净,屏蔽掉不会使用的父类成员,使得方法调用变得更加简洁,就像上面的IObject成员一样。
那么这一切是如何做到的呢?虽然我是一个诚实的人,但是其实这是一次赤裸裸的欺骗,而行骗的家伙就是将要闪亮登场的:
是的,正是System.CompentModel.EditorBrowsableAttriute。以上例而言,我其实为AnyObject类实现了下面的编码:
在通常的情况下,我的Anytao.Core.Common基础组件中都提供一个通用的IAnyObject接口,该接口的作用就是将object成员魔术般的隐藏掉,就如同本文开始的IObject一样。
所以,我们回到System.CompentModel.EditorBrowsableAttriute特性,就可以了解到其作用就是:标识一个类或者属性在编辑器中的可见性。
那么,难道他们真的消失了吗?继续应用一开始的代码:
[/code]
我们发现虽然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
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(); }
[/code]
关于object的故事,有很多很多。而今天的故事则着眼于“为熟悉的朋友做点儿不熟悉的事儿”。相信吗?我的Object成员不见了,不信你可以欣赏一下消失了的object成员。
[3].png]
哈哈!清新多了吧,比起下面常见的编码方式:
[3].png]
是不是让人不知所挫。大概说来,任何时候,在长长的成员方法列表中,你总能看到他们的身影,谁让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 { /// /// A common interface for any object /// [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()); } }
[/code]
我们发现虽然ToString对obj是不可见的,但是运行时调用仍然没有问题,所以,总体说来System.ComponentModel.EditorBrowsableAttribute只是一个障眼法,在此实现了对Visual Studio智能感知的控制。其中EditorBrowsableState选项主要包括了:
Advanced,针对高级成员的选项设置,同样的方式可以应用Visual Studio的Options->Text Editor->C#->General的Hide advanced members设置。
Always,总是可见。
Never,总是不可见。
注意:在Visual C#中,EditorBrowsableAttribute并不对同一程序集的成员有效。
还等什么?也去试试吧?另外关于编辑器,还有很多好玩的特性值得挖掘,贵在发现的力量。
参考文献
Show Advanced Members in Visual Studio,http://www.blackwasp.co.uk/ShowAdvancedMembers.aspx更多闲言碎语,关注anytao.net
相关文章推荐
- [你必须知道的.NET]第三十四回,object成员,不见了!
- [你必须知道的.NET]第三十四回,object成员,不见了!
- 艾伟:[你必须知道的.NET]第三十一回,深入.NET 4.0之,从“新”展望
- 艾伟:[你必须知道的.NET]第三十二回,深入.NET 4.0之,Tuple一二
- 你必须知道的.NET特性和属性(转载)
- [你必须知道的.NET]第二十七回:interface到底继承于object吗?
- [你必须知道的.NET]第二十七回:interface到底继承于object吗?
- 你必须知道的.NET特性和属性(转载)
- [你必须知道的.NET]之base和this(转)
- 有理想的程序员必须知道的15件事[转载]
- [你必须知道的.NET]第二十一回:认识全面的null
- [你必须知道的.NET] 第四回:后来居上:class和struct (转载)
- [你必须知道的.NET]第三十一回,深入.NET 4.0之,从“新”展望
- 转载:60个必须知道的生活常识
- 每一位想有所成就的程序员都必须知道的15件事(转载)
- 艾伟_转载:20条.NET编码习惯
- 读你必须知道的.NET(三)
- 读书笔记(一):【你必须知道的.NET】(0):【开篇】
- [你必须知道的.NET]第十六回:深入浅出关键字---using全接触
- 转载-成为一名嵌入式程序的必须知道的知识