[你必須知道的.NET】object成員,不見了!
在.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成員。
哈哈!清新多了吧,比起下面常見的編碼方式:
是不是讓人不知所挫。大概說來,任何時候,在長長的成員方法列表中,你總能看到他們的身影,誰讓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一樣。
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并不對同一程序集的成員有效。
還等什么?也去試試吧?另外關于編輯器,還有很多好玩的特性值得挖掘,貴在發現的力量。
參考文獻
- Show Advanced Members in Visual Studio,http://www.blackwasp.co.uk/ShowAdvancedMembers.aspx
更多閑言碎語,關注anytao.net
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.
本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。