2011-02-27 14 views
6

Estoy tratando de convertir un diccionario < dinámica, dinámica> a una estáticamente mecanografiada uno mediante el examen de los tipos de las claves y valores y la creación de un nuevo diccionario de los tipos apropiados usando Reflection. Si conozco los tipos de clave y valor, puedo hacer lo siguiente:genéricos dinámicos en tiempo de ejecución utilizando la reflexión

Type dictType = typeof(Dictionary<,>); 

     newDict = Activator.CreateInstance(dictType.MakeGenericType(new Type[] { keyType, valueType })); 

Sin embargo, es posible que tenga que crear, por ejemplo, un diccionario < MyKeyType, dinámica> Si los valores son no todos del mismo tipo, y no puedo encontrar la manera de especificar el tipo dinámico, ya que

typeof(dynamic) 

no es viable.

¿Cómo podría hacer esto, y/o hay una manera más simple de lograr lo que estoy tratando de hacer?

+0

Aparte de eso, ¿cuál es el uso? Crear los diccionarios a través de la reflexión y llenarlos de datos debe ser más lento que la sobrecarga de rendimiento de usar dinámico. –

Respuesta

2
Dictionary<MyType, Object> 

Activator.CreateInstance(typeof (Dictionary<dynamic, dynamic>)); 

En realidad, esto crea un Dictionary<Object, Object>

El único uso que puedo ver desde el uso dinámico en lugar de objeto está en el código de escritura Puede utilizar DIC [ "algunos"]. MyDynProperty .... pero si cree su objeto con el Activador devolverá el Objeto para no usarlo en la escritura de códigos ...

4

El compilador de C# emite System.Object como el tipo de "dinámico". "dinámico" es un constructo específico del lenguaje y no tiene un tipo correspondiente en la Infraestructura del Lenguaje Común. Como tal, no podrá usar la reflexión para crear un "dinámico" ni usar "dinámico" como parámetro de tipo genérico.

Un diccionario < dinámico, dinámico > es realmente un objeto de diccionario <, objeto >. Lo que significa "dinámico" para el compilador es simplemente vincular de forma tardía cualquier acceso de miembro para el objeto mediante reflexión (cuya implementación se encuentra en el ensamblado Microsoft.CSharp en caso de que tenga curiosidad).

En una nota lateral, el compilador también emitirá un atributo, DynamicAttribute, en campos, parámetros, etc. que son "dinámicos"; que permite a las personas que consumen los metadatos del ensamblaje distinguir entre un objeto del sistema y un "dinámico". Así es como IntelliSense muestra el parámetro de un método como dinámico a partir de una referencia de ensamblaje, por ejemplo.

+2

Como alguien que escribió un analizador de blob de firma de metadatos enviado en VS 2010, déjeme decirle que manejar adecuadamente DynamicAttribute es un verdadero dolor :) –

Cuestiones relacionadas