read property net dynamically create .net c#-4.0 anonymous-class dynamicobject

.net - property - list dynamic object c#



¿Hay alguna forma de convertir un objeto dinámico o anónimo en un objeto declarado de tipo fuerte? (4)

Si tengo un objeto dinámico, o un objeto anónimo, cuya estructura coincide exactamente con la de un objeto fuertemente tipado, ¿hay un método .NET para construir un objeto mecanografiado a partir del objeto dinámico?

Sé que puedo usar LINQ dynamicList.Select(dynamic => new Typed { .... } , o puedo usar Automapper, pero me pregunto si no hay algo especialmente diseñado para esto.


Aquí podemos convertir un objeto anónimo al diccionario.

Dictionary<string, object> dict = obj.GetType() .GetProperties() .ToDictionary(p => p.Name, p => p.GetValue(obj, null));

También puedes lanzar un objeto usando LINQ :

List<MyType> items = anonymousType.Select(t => new MyType(t.Some, t.Other)).ToList();


Podría serializar a un formato intermedio, solo para deserializarlo inmediatamente después. No es la forma más elegante o eficiente, pero podría hacer su trabajo:

Supongamos que esta es tu clase:

// Typed definition class C { public string A; public int B; }

Y esta es tu instancia anónima:

// Untyped instance var anonymous = new { A = "Some text", B = 666 };

Puede serializar la versión anónima a un formato intermedio y luego deserializarla nuevamente a una versión escrita.

var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); var json = serializer.Serialize(anonymous); var c = serializer.Deserialize<C>(json);

Tenga en cuenta que esto es en teoría posible con cualquier serializador / deserializador ( XmlSerializer , serialización binaria, otras librerías json), siempre que el viaje de ida y vuelta sea sincrónico.


Si su objeto se hereda de MarshalByRefObject, puede usar RealProxy.

Otra alternativa es usar Reflection, pero puede estar limitado por cosas que no están marcadas como virtuales y / o tiene que usar interfaces. También puede hacer que copie los valores, asumiendo que las propiedades son de escritura y que el constructor vacío funciona para su caso.

La respuesta real a su pregunta es no, no hay una forma automática de tratar un objeto dinámico como un tipo específico a menos que sea una instancia de ese tipo, ni tampoco existe una función automática para copiar los valores de un objeto dinámico / anónimo en una instancia de una clase nombrada.

El tiempo de ejecución no tiene idea de lo que está sucediendo en el constructor o cómo se implementa la clase internamente, por lo que cualquier instalación de este tipo eliminaría la seguridad del tipo fuera del agua. El punto central de la dinámica es permitir que duck typing / runtime dispatch / etc.

edición: si entendí mal la pregunta, hágamelo saber, pero supongo que desea tratar un objeto dinámico como si fuera una instancia de SomeType.

En mis propios proyectos, he usado una clase de Object Mapper para esto, en la que se combinan los nombres de las propiedades de escritura con tipos idénticos o coercibles, por lo que al menos no tuve que escribir 10,000 líneas de repetitivo, aunque mi fuente no lo era. t dinámico, así que utilicé Reflection.Emit / DynamicMethod para acelerarlo enormemente.


Su pregunta se reduce a la pregunta: ¿puedo convertir una variable de tipo estático en otra variable de tipo estático ( de diferentes cadenas de herencia )? y la respuesta, obviamente, es No.

¿Por qué su pregunta se reduce a la pregunta anterior?

  • El uso de tipo dinámico se compila en el uso del tipo de objeto con reflexión.
  • Su código recibe Objeto en realidad, que (en realidad) contiene valor de un tipo estático en particular.

Entonces, de hecho, su código trata con el valor tipificado estáticamente, asignado al Objeto y tratado como Dinámico en el momento de la compilación. Por lo tanto, el único caso en el que puede convertir un valor de tipo estático en otro [sin reflexión] es cuando forman parte de la misma cadena de herencia. De lo contrario, está obligado a usar la reflexión explícitamente (escrita por usted) o implícitamente (escrita por MS con uso dinámico).

En otras palabras, el siguiente código solo funcionará si el valor asignado a la dinámica es un tipo base o derivado de la Persona (inventado para el ejemplo):

dynamic dPerson = GetDynamicPerson(); Person thePerson = (Person)dPerson;

Eso es practicamente todo.

Para mencionar, puede copiar los valores byte a byte con un código no seguro que accede a las direcciones de memoria (como en C ++), pero para mí eso no es nada mejor que la reflexión.