在.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
{
/// <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並不對同一程序集的成員有效。
還等什麼?也去試試吧?另外關於編輯器,還有很多好玩的特性值得挖掘,貴在發現的力量。
文章來源:http://anytao.cnblogs.com/