2009-04-13 10 views
2

私はローカルおよびその逆からUTC日付を変換するために非常に単純な例に付属 、C#で(IExtension、IExtensibleObject)インターフェースを使用して、拡張対象パターンについて探索した。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秒AM
UTC:2009年4月13日午前五時39分19秒AM
現地時間:2009年4月13日11時09分19秒AM
任意のキーを押して続行します。 。 。

だから、それは動作しますが、質問は次のとおりです。

どの.NET Frameworkは、「添付」とIExtensionCollection.AddとIExtensionCollection.Detach方法は、プログラムによって呼び出されたときに、「デタッチ」を呼び出すのですか?私がここで欠けている内部の詳細を記入してください。

答えて

3

AttachおよびDetachの方法はそれぞれExtensionCollection<T>.InsertItemおよびExtensionsCollection<T>.RemoveItemと呼ばれます。これらのメソッドは、順番に、SynchronizedCollection<T>.AddSynchronizedCollection<T>.Removeという仮想メソッドです。これはコードの呼び出しを終了します。これはReflectorを使用して確認できます。 IExtensionCollection<T>の独自の実装を作成した場合、AttachDetachが正しく呼び出されるという保証はありません。

関連する問題