2010-05-20 7 views
1

J'essaie actuellement de créer une classe qui peut enregistrer des chaînes comme identificateurs et les associer à différents types d'énumérations, ces énumérations étant évaluées seulement dans une mesure telle que je m'assure que quand il est utilisé, le paramètre transmis à broadcast (messageType) est une instance du type Enum associé.en passant une "énumération inconnue" à une méthode

Cela fonctionnerait quelque chose comme ceci:

Diagnostics.RegisterIdentifier("logger", typeof(TestEnum)); 
Diagnostics.Broadcast("logger", TestEnum.Info, null, "Hello World", null); 

est ici le code que j'ai actuellement, je dois être en mesure de vérifier que messageTypesEnum est contenu dans messageTypesFromIdentifier.

private static Dictionary<string, Type> identifierMessageTypeMapping = new Dictionary<string, Type>(); 
    private static List<IListener> listeners = new List<IListener>(); 

    public static void RegisterIdentifier(string identifier, Type messageTypesEnum) 
    { 
     if (messageTypesEnum.BaseType.FullName == "System.Enum") 
     { 
      identifierMessageTypeMapping.Add(identifier, messageTypesEnum); 
     } 
     else 
     { 
      throw new ArgumentException("Expected type of messageTypesEnum to derive from System.Enum", "messageTypesEnum"); 
     } 
    } 



    public static void Broadcast(string identifier, object messageType, string metaIdentifier, string message, Exception exception) 
    { 
     if (identifierMessageTypeMapping.ContainsKey(identifier)) 
     { 
      Type messageTypesFromIdentifier = identifierMessageTypeMapping[identifier]; 
      foreach (var listener in listeners) 
      { 
       DiagnosticsEvent writableEvent = new DiagnosticsEvent(identifier, messageType, metaIdentifier, message, exception); 
       listener.Write(writableEvent); 
      } 
     } 
    } 

Répondre

1

Il semble que les génériques puissent être utiles pour ce que vous essayez de faire. Ensuite, vous pouvez combiner les appels en quelque chose comme

Diagnostics.Broadcast<TestEnum>("logger", TestEnum.Info, null, "Hello World", null); 
+0

Si nécessaire, vous pouvez aller plus loin et invoquer la méthode générique dynamiquement en utilisant 'MethodInfo.MakeGenericMethod' et ainsi de suite. – JoeGeeky

Questions connexes