2

私はC#で(IExtension、IExtensibleObject)インターフェイスを使用してExtensibleオブジェクトパターンについて調べていました。日付をローカルから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
UTC:2009年4月13日5:39:19午前
現地時間:2009年4月13日11:09:19AM
続行するには任意のキーを押してください。。。

だからそれはうまくいく、問題は:

IExtensionCollection.AddメソッドとIExtensionCollection.Detachメソッドがプログラムによって呼び出された場合、.Net Frameworkはどのように「Attach」と「Detach」を呼び出しますか?私がここに欠けている内部の詳細を記入してください。

4

1 に答える 1

3

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

于 2009-04-13T06:05:46.950 に答える