Poszukuję dyskusji z tym wpisem.ExpandoObject do obiektu statycznego iz powrotem. Obejmuję dwie domeny:
Zajmuję się włączeniem dynamicznych funkcji C# 4.0 do starszego systemu. Moim wyraźnym przykładem jest użycie Massive Rob Connery w warstwie danych. Ale moje pytania będą miały zastosowanie wszędzie tam, gdzie obiekt dynamiczny musi wchodzić w interakcje z istniejącym, silnie typowanym obiektem biznesowym, tak, że istnieje mapowanie między właściwościami.
mogę zautomatyzować konwersję do i od statycznych (betonowe) obiektów i przedmiotów EXPANDO z następujących dwóch metod (uproszczony):
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;
}
Ale teraz mam kilka pytań.
Czy moja próba rozpięcia dynamicznego i niedynamicznego w starym systemie jest błędnym przekonaniem z mojej strony? Czy to znaczy, że pracuję wbrew intencji dynamicznej? Czy podejmuję się problemów?
Czy moje wykorzystanie dynamiki powinno być ograniczone do komponentów, które ją całkowicie zawierają, bez odwzorowania między obiektami dynamicznymi a obiektami statycznymi? Czy to nie jest dobra praktyka, aby próbować mieszać te dwie domeny językowe? Czy tworzę złą architekturę? Anty-wzór?
W przypadku komponentu takiego jak Massive, jeśli mówimy, że niewłaściwym zwyczajem jest mapowanie między ExpandoObject i silnie wpisanymi obiektami, to nie ma możliwości, aby podłączyć go do mojego dotychczasowego systemu, ponieważ musi on wyprowadzać obiekty biznesowe do stary kod i nie ma praktycznego sposobu, w jaki mogę, lub powinienem, przekształcić obiekty dużej, starszej bazy kodu w obiekty dynamiczne. Może dynamiczne nie mogą być realistycznie dodane do starej bazy kodu .Net. Może to musi być włączone od początku lub wcale.
Jaką motywację masz do używania 'ExpandoObject's w ogóle? – svick