2009-04-13 2 views
2

я исследовал о Extensible шаблон объекта с использованием интерфейсов (IExtension, IExtensibleObject) в C#, я пришел с очень простой пример, чтобы преобразовать даты в формате UTC из локального и наоборот: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); 
    } 
} 

Выход:

Местное время: 4/13/2009 11:09:19 AM
UTC: 4/13/2009 5:39:19 AM
Местное время: 4/13/2009 11:09:19 AM
Нажмите любую клавишу, чтобы продолжить. , ,

Так это работает, вопрос:

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

ответ

3

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