IРасширение:расширяемый шаблон объекта:Как это работает?

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

Вопрос

Я изучал об расширяемом шаблоне объектов, используя интерфейсы (iextension, iextensibleObject) в C#, я пришел с очень простым примером для преобразования дат в 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);
    }
}

Выход:

Местное время:13.04.2009 11:09:19
УНИВЕРСАЛЬНОЕ ГЛОБАЛЬНОЕ ВРЕМЯ:13.04.2009 5:39:19
Местное время:13.04.2009 11:09:19
Нажмите любую клавишу для продолжения ...

Так это работает, вопрос в следующем:

Как платформа .Net вызывает «Присоединить» и «Отсоединить», когда программа вызывает методы IExtensionCollection.Add и IExtensionCollection.Detach?Заполните внутренние детали, которых мне здесь не хватает.

Это было полезно?

Решение

А Attach и Detach методы вызываются ExtensionCollection<T>.InsertItem и ExtensionsCollection<T>.RemoveItem, соответственно.Эти методы, в свою очередь, являются виртуальными методами, вызываемыми SynchronizedCollection<T>.Add и SynchronizedCollection<T>.Remove, что в конечном итоге вызывает ваш код.В этом можно убедиться, используя Отражатель.Если вы создали свою собственную реализацию IExtensionCollection<T>, нет никакой гарантии, что Attach и Detach будет называться правильно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top