es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Evento utilizando una restricción de tipo genérico en un delegado.

Intentaba implementar (en C#8.0) una clase con un parámetro de tipo genérico (restringido a un delegado) que tenga un parámetro de evento con el mismo tipo genérico. El propósito previsto es tener algún manejo personalizado de eventos (funciones de suscripción y desuscripción) al tiempo que se permite cualquier tipo de delegado asociado.

public class AEvent<t> where T : Delegate
{
    private event T eventData;

    public AEvent() { }
}

Comenzando con el código anterior, el IDE me muestra este error:

‘eventData’: el evento debe ser de un tipo delegado

¿Alguien puede explicar brevemente por qué no puedo implementar esto? ¿O si hay alguna otra forma alternativa de lograr esto?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La razón por la cual esta implementación no está permitida es porque “event” solo puede ser de un tipo delegate, no de un parámetro de tipo genérico restringido a Delegate. Esto significa que el tipo del evento debe ser explícito y no puede ser definido por un parámetro de tipo genérico.

    Una posible solución alternativa es definir una interfaz no genérica para el manejo de eventos y hacer que la clase genérica la implemente. Por ejemplo:

    public interface IEventHandling
    {
        void AddEventHandler(Delegate handler);
        void RemoveEventHandler(Delegate handler);
    }
    
    public class AEvent<t> : IEventHandling where T : Delegate
    {
        private event T eventData;
    
        public AEvent() { }
    
        public void AddEventHandler(Delegate handler)
        {
            eventData = (T)Delegate.Combine(eventData, handler);
        }
    
        public void RemoveEventHandler(Delegate handler)
        {
            eventData = (T)Delegate.Remove(eventData, handler);
        }
    }
    

    De esta manera, el parámetro de tipo genérico T todavía puede ser un delegate y la lógica de manejo de eventos puede ser definida en la interfaz no genérica.

Comments are closed.