Pregunta

I estaba explorando sobre modelo objeto Extensible utilizando interfaces (IExtension, IExtensibleObject) en C #, Vine con un ejemplo muy sencillo para convertir las fechas para CST desde viceversa local y:

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

Salida:

  

Hora local: 4/13/2009 11:09:19 AM
  UTC: 4/13/2009 5:39:19 AM
  Hora local: 4/13/2009 11:09:19 AM
  Pulse cualquier tecla para continuar . . .

Así funciona, la pregunta es:

¿Cómo marco .Net invocar "Adjuntar" y "Separar" cuando los métodos IExtensionCollection.Add y IExtensionCollection.Detach son invocados por el programa? Rellene los detalles internos que estoy perdiendo aquí.

¿Fue útil?

Solución

El Attach y métodos Detach son llamados por ExtensionCollection<T>.InsertItem y ExtensionsCollection<T>.RemoveItem, respectivamente. Estos métodos, a su vez, son los métodos virtuales llamados por SynchronizedCollection<T>.Add y SynchronizedCollection<T>.Remove, que es lo que termina su código llamando al. Esto se puede verificar mediante el uso de Reflector . Si ha creado su propia implementación de IExtensionCollection<T>, no hay garantía de que Attach y Detach serían llamados correctamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top