2009-04-13 60 views
2

我使用C#(IExtension,IExtensibleObject)接口探索有關可擴展對象模式, 我想出了一個非常簡單的例子,將日期從轉換爲UTC地方,反之亦然:IExtension:可擴展對象模式:它是如何工作的?

public class BaseObject : IExtensibleObject<BaseObject> 
{ 
    private DateTime _startDate; 
    private ExtensionCollection<BaseObject> _extensions; 

    public DateTime StartDate 
    { 
     get { return _startDate; } 
     set { _startDate = value; } 
    } 

    public BaseObject() 
    { 
     StartDate = DateTime.Now; 
     _extensions = new ExtensionCollection<BaseObject>(this); 
    } 

    #region IExtensibleObject<BaseObject> Members 

    public IExtensionCollection<BaseObject> Extensions 
    { 
     get 
     { 
      return _extensions; 
     } 
    } 

    #endregion 
} 

public class DateTimeConverterExtension : IExtension<BaseObject> 
{ 
    private BaseObject _owner; 

    #region IExtension<BaseObject> Members 

    public void Attach(BaseObject owner) 
    { 
     _owner = owner; 
     _owner.StartDate = owner.StartDate.ToUniversalTime(); 
    } 

    public void Detach(BaseObject owner) 
    { 
     _owner.StartDate = _owner.StartDate.ToLocalTime(); 
    } 

    #endregion 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     BaseObject obj = new BaseObject(); 
     Console.WriteLine("Local Time: "+obj.StartDate); 

     obj.Extensions.Add(new DateTimeConverterExtension()); 


     Console.WriteLine("UTC: "+obj.StartDate); 

     DateTimeConverterExtension ext = obj.Extensions.Find<DateTimeConverterExtension>(); 
     obj.Extensions.Remove(ext); 

     Console.WriteLine("Local Time: "+obj.StartDate); 
    } 
} 

輸出:

本地時間:2009年4月13日上午11時09分19秒
UTC:2009年4月13日上午05點39分十九秒
本地時間:2009年4月13日上午11時09分19秒
按任意鍵繼續。 。 。

所以它的工作原理,但問題是:

如何Net框架調用「附加」和「分離」時IExtensionCollection.Add和IExtensionCollection.Detach方法由程序調用的?填寫我在這裏失蹤的內部細節。

回答

3

AttachDetach方法分別由ExtensionCollection<T>.InsertItemExtensionsCollection<T>.RemoveItem調用。反過來,這些方法是由SynchronizedCollection<T>.AddSynchronizedCollection<T>.Remove調用的虛擬方法,這是您的代碼最終調用的內容。這可以通過使用Reflector進行驗證。如果您創建了自己的IExtensionCollection<T>實施,則不能保證AttachDetach會被正確調用。