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>
{
}