2012-07-16 9 views
7

He siguiente clase deDiccionario con el delegado como valor

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

    } 

Quiero tener un diccionario con las asignaciones, que cada tipo de argumento se asignará a su función aplicación: El latido del corazón se asignará a public int Visit(Heartbeat element)

pensé que hacer algo como lo siguiente: "¿qué debería estar aquí"

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

lo que debería poner en su lugar y "¿y cómo lo puse aquí?"

Gracias

+1

¿Cómo se ven sus métodos (es decir, ¿son similares en definición?) –

+0

tal vez, podría crear sus métodos como Delegados, y su TValue en su Diccionario será System.Delegate .. ¿lo ha intentado? –

+0

@Yet Otro Geek, la función Visitor tiene una implementación completamente diferente, son mapeadores DTO –

Respuesta

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

¿por qué está usando Action? Tengo un valor de retorno allí –

+0

si cVisitor es una instancia de CVisitor cómo lo registro con el nuevo Func (heartbeat => (cVisitor.Visit (heartbeat)) –

+1

@NightWalker verifique la variante actual –

2

¿Conoce Action y Func objetos? Parece lo que estás buscando.

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

PS: YAG THX

+1

Si desea hacerlo de esta manera, entonces debe ser 'Action' y no' Action 'ya que no se da ninguna entrada de cadena –

0

Su mejor llamado aquí es utilizar la reflexión.
1. Obtenga todos los métodos de Visitor Class (¿O todos los métodos llamados "Visit"?) Con typeof (Visitor) .GetMethods().
2. GetMethods devuelve un IEnumerable de MethodInfo. GetParameters le dará los parámetros para cada Método.
3. Ahora puede construir su Dictionnary de (Tipo, MethodInfo)
4. use Invoke para llamar al Método.

Rq: Una ventaja del uso de la reflexión es que el Dictionnary aún estará actualizado si agrega un nuevo método. No hay riesgo de olvidarse de agregar un método.

Cuestiones relacionadas