tengo objeto XML mensajes serializados que entra en una clase llamada MessageRouter. El XML contiene el nombre de tipo desde el que se serialó, y necesito poder invocar diferentes métodos de delegado según el tipo que no se conocen hasta el momento de ejecución, . No soy muy fuerte en los genéricos y espero que esto tendrá sentido para alguien ...Diccionario de Acción <T> delegados
me gustaría MessageRouter para proporcionar una RegisterDelegateForType método de este modo:
myMessageRouter.RegisterDelegateForType(new Action<MySerializableType>(myActionHandler));
Y luego almacenar los tipos o la representación del tipo de cadena en un diccionario como esto:
Dictionary<Type, Action<T>> registeredDelegates;
de esa manera, se puede hacer algo como lo siguiente pseudocódigo, llamando delegado asignado al tipo y pasando el objeto deserializado:
Type xmlSerializedType = TypeFromXmlString(incomingXml);
object deserializedObject = DeserializeObjectFromXml(xmlSerializedType, incomingXml);
// then invoke the action and pass in the deserialized object
registeredDelegates[xmlSerializedType](deserializedObject);
Así que mis preguntas son:
- ¿Cómo se define un diccionario que puede contener un
Type
como una llave y un genéricoAction<T>
como un valor, y tienen el método RegisterDelegateForType pueblan el diccionario? - Si eso no es posible, ¿cuál es la mejor manera de hacerlo?
¿Por qué no hacer que IDictionary sea un diccionario? –
thecoop
Supongo que estaba esperando a ver si routeNpingme necesitaría soportar un tipo de delegado de void Acción (T t); Si es así, no podría usar Diccionario > y este diseño podría modificarse fácilmente para respaldar eso. Si no, entonces sí, un Diccionario sería lo mejor. Incluso si necesita admitir la Acción , el diseño sería aún mejor si hubiera usado Diccionario . –
user152862