2012-10-03 37 views
85

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 Controller clase en otros tipos de aplicaciones. Cuando traté de crear dynamic objeto y puse que es propiedad, como a continuación:¿Cómo crear un tipo dinámico propio o un objeto dinámico en C#?

1. dynamic MyDynamic = new { A="a" }; 
2. MyDynamic.A = "asd"; 
3. Console.WriteLine(MyDynamic.A); 

Tengo RuntimeBinderException con el mensaje de inmuebles o indexador '<> f__AnonymousType0.A' no puede ser asignado a - que sólo se lee 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.

Respuesta

181
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()); 

Más información acerca de ExpandoObject class y para más muestras: representa un objeto cuyos miembros se pueden añadir de forma dinámica y eliminado en tiempo de ejecución.

+2

Por favor vote por esta función en Visual Studio [UserVoice] (https: //visualstudio.uservoice. com/forums/121579-visual-studio/suggestions/7062098-support-object-initializers-on-expandoobjects). – orad

28

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; 
7
dynamic MyDynamic = new ExpandoObject(); 
9

Puede utilizar ExpandoObject Class que está en System.Dynamic espacio de nombres.

dynamic MyDynamic = new ExpandoObject(); 
MyDynamic.A = "A"; 
MyDynamic.B = "B"; 
MyDynamic.C = "C"; 
MyDynamic.SomeProperty = SomeValue 
MyDynamic.number = 10; 
MyDynamic.Increment = (Action)(() => { MyDynamic.number++; }); 

Más información se puede encontrar en ExpandoObject MSDN

15

recientemente he tenido la necesidad de llevar esto un paso más allá, que era hacer las adiciones de propiedad en el objeto dinámico, dinámica a sí mismos, en función del usuario definido entradas. Los ejemplos aquí, y desde Microsoft's ExpandoObject documentation, 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í es una versión muy simplificada de cómo agregar propiedades dinámicas verdaderamente a un ExpandoObject (haciendo caso omiso de la palabra clave y otras manipulaciones):

 // 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); 
Cuestiones relacionadas