2009-04-13 2 views
2

나는 C#에서 (IExtension, IExtensibleObject) 인터페이스를 사용하여 확장 가능한 개체 패턴에 대해 탐구하고, 나는에서 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); 
    } 
} 

출력 :

지역 시간 : 2009년 4월 13일 오전 11시 9분 19초
UTC : 2009년 4월 13일 오전 5시 39분 19초
지역 시간 : 2009년 4월 13일 오전 11시 9분 19초
계속하려면 아무 키나 누르십시오. . .

어떻게 닷넷 프레임 워크는 "첨부"와 IExtensionCollection.Add 및 IExtensionCollection.Detach 방법은 프로그램에 의해 호출된다 "분리"호출 않습니다

은 그래서 질문은, 작동? 여기에 누락 된 내부 세부 정보를 입력하십시오.

답변

3

Attach 및 메서드는 ExtensionCollection<T>.InsertItemExtensionsCollection<T>.RemoveItem으로 각각 호출됩니다. 이 메소드는 차례로 SynchronizedCollection<T>.AddSynchronizedCollection<T>.Remove이라는 가상 메소드로 코드가 호출됩니다. 이는 Reflector을 사용하여 확인할 수 있습니다. 자신의 구현을 IExtensionCollection<T>으로 만든 경우 AttachDetach이 올바르게 호출된다는 보장이 없습니다.