IExtension:拡張可能オブジェクトパターン:それはどのように動作しますか?

StackOverflow https://stackoverflow.com/questions/743121

質問

私は、C#で(IExtension、IExtensibleObject)インターフェースを使用して、拡張対象パターンについて探索しました 私は、ローカルおよびその逆からUTCに日付を変換するために非常に単純な例で来ます:

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日午前5時39分19秒AM
  現地時間:2009年4月13日11時09分19秒AM
  何かキーを押すと続行します 。 。ます。

それは動作しますので、質問があります:

どのように.NET Frameworkが「添付」とIExtensionCollection.AddとIExtensionCollection.Detach方法は、プログラムによって呼び出される「デタッチ」を呼び出すのですか?私がここで行方不明です内部の詳細を入力します。

役に立ちましたか?

解決

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top