Estoy buscando alguna discusión con esta publicación.ExpandoObject al objeto estático y viceversa. Abarcando los dos dominios
Estoy buscando incorporar funciones dinámicas C# 4.0 en un sistema heredado. Mi ejemplo explícito es usar Massive de Rob Connery en una capa de datos. Pero mis preguntas se aplicarían en cualquier lugar en el que un objeto dinámico deba interactuar con un objeto comercial existente, fuertemente tipado, de modo que haya una asignación entre las propiedades.
que puede automatizar la conversión desde y hacia los objetos estáticos (hormigón) y objetos expando con los dos métodos siguientes (simplificado):
public static object ToConcrete<T>(System.Dynamic.ExpandoObject dynObject)
{
object instance = Activator.CreateInstance<T>();
var dict = dynObject as IDictionary<string, object>;
PropertyInfo[] targetProperties = instance.GetType().GetProperties();
foreach (PropertyInfo property in targetProperties)
{
object propVal;
if (dict.TryGetValue(property.Name, out propVal))
{
property.SetValue(instance, propVal, null);
}
}
return instance;
}
public static System.Dynamic.ExpandoObject ToExpando(object staticObject)
{
System.Dynamic.ExpandoObject expando = new ExpandoObject();
var dict = expando as IDictionary<string, object>;
PropertyInfo[] properties = staticObject.GetType().GetProperties();
foreach (PropertyInfo property in properties)
{
dict[property.Name] = property.GetValue(staticObject, null);
}
return expando;
}
Pero ahora tengo una serie de preguntas.
¿Mi intento de abarcar dinámicas y no dinámicas en un sistema heredado representa una idea errónea de mi parte? Es decir, ¿estoy trabajando en contra de la intención dinámica? ¿Me estoy preparando para problemas?
¿Debería mi uso de la dinámica estar limitado a componentes que lo contengan completamente sin mapeo entre objetos dinámicos y objetos estáticos? Es decir, ¿es una mala práctica intentar mezclar los dos dominios del lenguaje? ¿Estoy creando una mala arquitectura? Un antipatrón?
En el caso de un componente como Massive, si decimos que es una mala práctica mapear entre objetos expandidos y fuertemente tipados, entonces no hay forma de que pueda conectarlo a mi sistema heredado, ya que debe hacer aparecer objetos comerciales en el código heredado y no hay una manera práctica en que pueda, o deba, refactorizar los objetos de una base de código heredada grande en objetos dinámicos. Quizás la dinámica no se puede agregar de manera realista a una base de código .Net heredada. Tal vez tiene que ser incorporado desde el principio, o no en absoluto.
¿Qué motivación tiene para usar 'ExpandoObject's en absoluto? – svick