No muy fácil, no. La reflexión no funciona, ya que asume un modelo de tipo normal, que es , no, el rango completo de dynamic
. Si en realidad solo estás hablando con objetos regulares, entonces usa la reflexión aquí. De lo contrario, supongo que es posible que desee realizar una ingeniería inversa del código que el compilador emite para una asignación básica, y modificarlo para que tenga un nombre de miembro flexible. Sin embargo, seré sincero: esta no es una opción atractiva; un simple:
dynamic foo = ...
foo.Bar = "abc";
se traduce en:
if (<Main>o__SiteContainer0.<>p__Site1 == null)
{
<Main>o__SiteContainer0.<>p__Site1 = CallSite<Func<CallSite, object, string, object>>.Create(Binder.SetMember(CSharpBinderFlags.None, "Bar", typeof(Program), new CSharpArgumentInfo[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null), CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.Constant | CSharpArgumentInfoFlags.UseCompileTimeType, null) }));
}
<Main>o__SiteContainer0.<>p__Site1.Target(<Main>o__SiteContainer0.<>p__Site1, foo, "abc");
Si desea un enfoque que funciona para ambos objetos dinámicos y no dinámicos: FastMember es útil para esto, y funciona ya sea en el tipo o nivel de objeto:
// could be static or DLR
var wrapped = ObjectAccessor.Create(obj);
string propName = // something known only at runtime
Console.WriteLine(wrapped[propName]);
disponible en Nuget, y muy optimizado para dinámica y no dinámica sc enarios.
La reflexión es probablemente su propia solución, a menos que ponga sus propiedades en un hashmap para que puedan determinarse en tiempo de ejecución. –
posible duplicado de [Agregar propiedades desconocidas (en tiempo de diseño) a un ExpandoObject] (http://stackoverflow.com/questions/2974008/adding-unknown-at-design-time-properties-to-an-expandoobject) – nawfal