dinamicos - ¿Cómo crear un tipo dinámico propio o un objeto dinámico en C#?
objetos dinamicos c# (5)
Puede usar ExpandoObject Class
que se encuentra en System.Dynamic
namespace.
dynamic MyDynamic = new ExpandoObject();
MyDynamic.A = "A";
MyDynamic.B = "B";
MyDynamic.C = "C";
MyDynamic.SomeProperty = SomeValue
MyDynamic.number = 10;
MyDynamic.Increment = (Action)(() => { MyDynamic.number++; });
Se puede encontrar más información en ExpandoObject MSDN
Ahí está, por ejemplo, la propiedad ViewBag de la clase ControllerBase
y podemos obtener / establecer valores dinámicamente y agregar cualquier cantidad de campos o propiedades adicionales a este objeto, lo cual es genial. Quiero usar algo así, más allá de la aplicación MVC y la clase Controller
en otros tipos de aplicaciones. Cuando traté de crear dynamic objeto dynamic y establecer su propiedad como a continuación:
1. dynamic MyDynamic = new { A="a" };
2. MyDynamic.A = "asd";
3. Console.WriteLine(MyDynamic.A);
Tengo RuntimeBinderException
con el mensaje Propiedad o indexador ''<> f__AnonymousType0.A'' no se puede asignar a - se lee solo en la línea 2. También sugiero que no es exactamente lo que estoy buscando. Tal vez haya alguna clase que me permita hacer algo como:
??? MyDynamic = new ???();
MyDynamic.A = "A";
MyDynamic.B = "B";
MyDynamic.C = DateTime.Now;
MyDynamic.TheAnswerToLifeTheUniverseAndEverything = 42;
con propiedades dinámicas de adición y configuración.
Recientemente tuve la necesidad de dar un paso más, que consistía en hacer las adiciones de propiedades en el objeto dinámico, dinámicas por sí mismas, basadas en las entradas definidas por el usuario. Los ejemplos aquí, y de la documentación de ExpandoObject de Microsoft , no abordan específicamente la adición de propiedades dinámicamente, pero se pueden suponer a partir de cómo enumera y elimina propiedades. De todos modos, pensé que esto podría ser útil para alguien. Aquí hay una versión extremadamente simplificada de cómo agregar propiedades realmente dinámicas a un ExpandoObject (ignorando la palabra clave y otro manejo):
// my pretend dataset
List<string> fields = new List<string>();
// my ''columns''
fields.Add("this_thing");
fields.Add("that_thing");
fields.Add("the_other");
dynamic exo = new System.Dynamic.ExpandoObject();
foreach (string field in fields)
{
((IDictionary<String, Object>)exo).Add(field, field + "_data");
}
// output - from Json.Net NuGet package
textBox1.Text = Newtonsoft.Json.JsonConvert.SerializeObject(exo);
ExpandoObject
es lo que estás buscando.
dynamic MyDynamic = new ExpandoObject(); // note, the type MUST be dynamic to use dynamic invoking.
MyDynamic.A = "A";
MyDynamic.B = "B";
MyDynamic.C = "C";
MyDynamic.TheAnswerToLifeTheUniverseAndEverything = 42;
dynamic MyDynamic = new ExpandoObject();
dynamic MyDynamic = new System.Dynamic.ExpandoObject();
MyDynamic.A = "A";
MyDynamic.B = "B";
MyDynamic.C = "C";
MyDynamic.Number = 12;
MyDynamic.MyMethod = new Func<int>(() =>
{
return 55;
});
Console.WriteLine(MyDynamic.MyMethod());
Obtenga más información acerca de la clase ExpandoObject y de más ejemplos: representa un objeto cuyos miembros se pueden agregar y eliminar dinámicamente en tiempo de ejecución.