Me doy cuenta de que esto ha sido respondido, pero utilicé un enfoque diferente y pensé que podría valer la pena compartirlo. Además, siento que mi enfoque puede producir gastos indirectos no deseados. Sin embargo, no soy capaz de observar o calcular todo lo que sucede que es malo bajo las cargas que observamos. Estaba buscando comentarios útiles sobre este enfoque.
El problema con el trabajo con dinámica es que no puede adjuntar ninguna función directamente al objeto dinámico. Tienes que usar algo que pueda descifrar las asignaciones que no quieras resolver cada vez.
Al planear esta solución simple, analicé cuáles son los intermediarios válidos cuando intento volver a escribir objetos similares. Encontré que una matriz binaria, una cadena (xml, json) o una conversión de codificación dura (IConvertable) eran los enfoques habituales. No quiero entrar en las conversiones binarias debido a un factor de mantenimiento del código y la pereza.
Mi teoría era que Newtonsoft podría hacer esto mediante el uso de un intermediario de cadena.
Como desventaja, estoy bastante seguro de que al convertir la cadena a un objeto, que usaría la reflexión buscando en el ensamblaje actual un objeto con propiedades coincidentes, cree el tipo, luego instale las propiedades, lo que requeriría más reflexión. Si es verdadero, todo esto puede considerarse una carga indirecta evitable.
C#:
//This lives in a helper class
public static ConvertDynamic<T>(dynamic data)
{
return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(Newtonsoft.Json.JsonConvert.SerializeObject(data));
}
//Same helper, but in an extension class (public static class),
//but could be in a base class also.
public static ToModelList<T>(this List<dynamic> list)
{
List<T> retList = new List<T>();
foreach(dynamic d in list)
{
retList.Add(ConvertDynamic<T>(d));
}
}
Con eso dicho, esto encaja otra utilidad he juntado que me permite hacer cualquier objeto en una dinámica. Sé que tenía que usar el reflejo para hacerlo correctamente:
public static dynamic ToDynamic(this object value)
{
IDictionary<string, object> expando = new ExpandoObject();
foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(value.GetType()))
expando.Add(property.Name, property.GetValue(value));
return expando as ExpandoObject;
}
Tenía que ofrecer esa función. Un objeto arbitrario asignado a una variable de tipo dinámico no se puede convertir a IDictionary, y romperá la función ConvertDynamic. Para que se use esta cadena de funciones, se debe proporcionar una dinámica de System.Dynamic.ExpandoObject o IDictionary < string, objeto >.
¿Está diciendo que necesita llamar dinámicamente a un operador de conversión implícita o explícita? – Gabe
cualquiera de los dos, explícita –