IРасширение:расширяемый шаблон объекта:Как это работает?
-
09-09-2019 - |
Вопрос
Я изучал об расширяемом шаблоне объектов, используя интерфейсы (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
будет называться правильно.