2012-07-16 15 views
7

Ho seguente classedizionario con delega come valore di

public class CVisitor : IVisitor 
    { 
     public int Visit(Heartbeat element) 
     { 
      Trace.WriteLine("Heartbeat"); 
      return 1; 
     } 
     public int Visit(Information element) 
     { 
      Trace.WriteLine("Information"); 
      return 1; 
     } 

    } 

voglio avere un dizionario con mappature, che ogni tipo di argomento verrà mappato la sua funzione di attuazione: Heartbeat verrà mappato public int Visit(Heartbeat element)

Ho pensato di fare qualcosa come segue:

_messageMapper = new Dictionary<Type, "what should be here ?" >(); 
    _messageMapper.Add(typeof(Heartbeat), "and how I put it here?"); 

cosa dovrei mettere invece "cosa dovrebbe essere qui?" e "e come lo metto qui?"

Grazie

+1

Come appaiono i tuoi metodi (ad esempio sono simili nella definizione?) –

+0

forse potresti creare i tuoi metodi come delegati e il tuo TValue nel tuo dizionario sarà System.Delegate .. hai provato? –

+0

@Yet Another Geek, la funzione di Visitatore hanno completamente diversa implementazione, sono mapper DTO –

risposta

7
new Dictionary<Type, Func<object, int>>(); 

var cVisitor = new CVisitor(); 
_messageMapper.Add(typeof(Heartbeat), 
    new Func<object, int>(heartbeat => cVisitor.Visit((Heartbeat)heartbeat)) 
); 
+0

Perché stai usando azione? Ho un valore di ritorno ci –

+0

se cVisitor è istanza di CVisitor come ho la registrazione con il nuovo Funz (battito cardiaco => (cVisitor.Visit (battito cardiaco)) –

+1

@NightWalker controllare variante corrente –

2

Sapete Action e Func oggetti? Sembra quello che stai cercando.

var d = new Dictionary<Type, Action>(); 
d.Add(typeof(HeartBeat),()=>Trace.WriteLine("todum todum")); 

PS: thx YAG

+1

Se si vuole fare in questo modo, allora dovrebbe essere 'Action' e non' 'azione come nessuna stringa di input è dato –

0

Il tuo miglior invito è quello di utilizzare la riflessione.
1. Ottieni tutti i metodi di Visitor Class (o tutti i metodi chiamati "Visit"?) Con typeof (Visitor) .GetMethods().
2. GetMethods restituisce un oggetto IEnumerable di MethodInfo. GetParameters ti fornirà i parametri per ogni metodo.
3. Quindi ora è possibile creare il proprio dizionario di (Tipo, MethodInfo)
4. utilizzare Invoke per chiamare il metodo.

Rq: Un vantaggio dell'utilizzo della riflessione è che il dizionario Dictionary sarà ancora aggiornato se si aggiunge un nuovo metodo. Nessun rischio di dimenticare di aggiungere un metodo.

Problemi correlati