IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

EventManager : Generic Action Contraintes


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 3
    Par défaut EventManager : Generic Action Contraintes
    Bonjour messieurs,

    Je rencontre une problématique sur un manageur d'évênement sur lequel je travaille actuellement, actuellement il n'y a pas de contraintes pour définir qu'un type générique est une delegate, deplus il n'y a pas d'interface permettant d'avoir les opérateurs +=, -=.

    Par conséquent je cherche à faire compiler cette ligne : this.events[EnumHelper.GetIndex<EnumType>(enumeration)] += action;

    Auriez-vous des idées de comment la faire compiler ?

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    using System.Collections.Generic;
    using System;
     
    public static class EnumHelper
    {
        public static int GetIndex<EnumType>(EnumType enumeration) where EnumType : struct, IConvertible
        {
            return Convert.ToInt32(enumeration);
        }
     
        public static int Count<EnumType>() where EnumType : struct, IConvertible
        {
            return System.Enum.GetValues(typeof(EnumType)).Length;
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    using System.Collections.Generic;
    using System;
     
    public abstract class AEventManager<EventType, EnumType> 
        where EnumType : struct, IConvertible
        where EventType : class, Action<int>
    {
        protected EventType[] events;
     
        public AEventManager()
        {
            if (!typeof(EnumType).IsEnum)
                throw new ArgumentException("EnumType must be an enumerated type");
     
            this.events = new EventType[EnumHelper.Count<EnumType>()];
        }
     
        protected EventType GetEvent(EnumType enumeration)
        {
            return this.events[EnumHelper.GetIndex<EnumType>(enumeration)];
        }
     
        public void SubcribeToEvent(EnumType enumeration, EventType action)
        {
            this.events[EnumHelper.GetIndex<EnumType>(enumeration)] += action;
        }
     
        //Unsubscribe, abstract callDelegate(EnumType enumeration, ... templateVarags)..
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public class EventManager : AEventManager<Action<int>, EEvent>
    {
    }

  2. #2
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Première piste :
    Impossible d'appliquer l'opérateur '+=' aux opérandes de type 'EventType' et 'EventType'

  3. #3
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Cela compile :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                EventType ev = GetEvent(enumeration);
                ev = action;

  4. #4
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    En faite ça parait normal en simplifiant le code, ça revient à faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                int[] tab = { 10, 20, 30 };
                get(tab, 2) = 5;
     
            private int get(int[] tab, int idx)
            {
                return tab[idx];
            }

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 3
    Par défaut
    Bonjour eric,

    Je vais énumérer les 2 défauts de ta démarche :
    • L'intérêt d'une action (delegate) et qu'il contiend les opérateurs +=, -=, ceci signifie que l'on est pas limité à une seule action mais plutôt un groupe d'action.

    • Tu utilise un int pour faire le lien directement avec l'index de ton tableau d'evênements, c'est légèrement plus optimisé mais sachant que le cast d'un int vaut environ 1-2 cycles soit vraiment peu de choses, je souhaite rendre mon code beaucoup plus verbeux. Par exemple
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
       
      AEventManager<Action<int, float>, EEvent> eventManager = new AEventManager<Action<int, float>, EEvent>();
       
      eventManager.SubscribeToEvent(EEvent.NomDunIndexDeCetteEnumeration, uneFonctionPrenantEnParametreUnIntEtUnFloat);
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
       
      void toto()
      {
           eventManager.CallDelegate(EEvent.NomDunIndexDeCetteEnumeration);
       
      }

Discussions similaires

  1. Action Struts 2 et generics
    Par mystia dans le forum Struts 2
    Réponses: 1
    Dernier message: 16/02/2012, 17h22
  2. Réponses: 2
    Dernier message: 17/08/2006, 14h50
  3. action APRES chargement complet ...
    Par PinGuy dans le forum Delphi
    Réponses: 7
    Dernier message: 06/07/2006, 17h16
  4. Suppression de la contrainte unique
    Par mika dans le forum SQL
    Réponses: 3
    Dernier message: 20/02/2003, 17h56
  5. [VB6] Affichage d'image avec qlq contraintes
    Par youri dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 21/11/2002, 14h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo