2012-07-16 18 views
7

Mam następujące klasysłownik z delegatem jako wartość

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

    } 

chcę mieć słownik z odwzorowań, że każdy typ argumentu będą mapowane do jego funkcja realizacja: Heartbeat zostaną odwzorowane na public int Visit(Heartbeat element)

Pomyślałem, aby zrobić coś takiego:

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

co powinienem zamiast tego wpisać "co powinno tu być?" i "i jak to tutaj umieściłem?"

Dzięki

+1

Jak wyglądają twoje metody (tzn. Czy są podobne w definicji?) –

+0

może, możesz stworzyć swoje metody jako Delegatów, a Twoja TValue w Słowniku będzie System.Delegate .. czy próbowałeś tego? –

+0

@Yet Another Geek, funkcja Visitor ma zupełnie inną implementację, są to maperzy DTO: –

Odpowiedz

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

dlaczego używasz Action? Mam wartość zwracaną tam –

+0

, jeśli cVisitor jest instancją CVisitora, w jaki sposób rejestruję ją nowym Func (heartbeat => (cVisitor.Visit (heartbeat)) –

+1

@NightWalker sprawdź aktualny wariant –

2

Znasz Action i Func obiekty? Wygląda na to, czego szukasz.

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

PS: thx YAG

+1

Jeśli chcesz to zrobić w ten sposób, to powinno być 'Akcja', a nie' Akcja 'jako że żadne wejście łańcuchowe nie jest podane –

0

Najlepszym wezwanie tutaj jest użycie refleksji.
1. Uzyskać wszystkie metody klasy odwiedzającej (lub wszystkie metody o nazwie "Visit"?) Z typem (Visitor) .GetMethods().
2. GetMethods zwraca wartość IEnumerable MethodInfo. GetParameters podaje parametry dla każdej Metody.
3. Teraz możesz zbudować swój słownik (Type, MethodInfo)
4. użyć Invoke, aby wywołać metodę.

Rq: Zaletą korzystania z refleksji jest to, że słownik będzie wciąż aktualny, jeśli doda się nową metodę. Bez ryzyka zapomnienia o dodaniu metody.

Powiązane problemy