2009-04-13 8 views
2

J'explorais à propos de modèle d'objet extensible à l'aide (IExtension, IExtensibleObject) interfaces en C#, je suis venu avec un exemple très simple de convertir les dates UTC du niveau local et vice-versa:IExtension: modèle d'objet extensible: Comment ça marche?

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); 
    } 
} 

Sortie:

Heure locale: 4/13/2009 11:09:19 UTC
: 4/13/2009 05:39:19
Heure locale: 4/13/2009 11:09:19
Appuyez sur n'importe quelle touche pour continuer. . .

Il fonctionne, la question est:

Comment framework .Net invoquez « Joindre » et « Détacher » lorsque les méthodes IExtensionCollection.Add et IExtensionCollection.Detach sont invoquées par le programme? Remplissez les détails internes qui me manquent ici.

Répondre

3

Les méthodes Attach et Detach sont appelés par ExtensionCollection<T>.InsertItem et ExtensionsCollection<T>.RemoveItem, respectivement. Ces méthodes, à leur tour, sont des méthodes virtuelles appelées par SynchronizedCollection<T>.Add et SynchronizedCollection<T>.Remove, qui est ce que votre code finit par appeler. Cela peut être vérifié en utilisant Reflector. Si vous avez créé votre propre implémentation de IExtensionCollection<T>, il n'y a aucune garantie que Attach et Detach seraient appelés correctement.

Questions connexes