2012-10-03 10 views
85

C'è, ad esempio, la proprietà ViewBag della classe ControllerBase e siamo in grado di ottenere/impostare dinamicamente i valori e aggiungere qualsiasi numero di campi o proprietà aggiuntivi a questo oggetto, che è bello. Voglio usare qualcosa di simile, oltre l'applicazione MVC e Classe Controller in altri tipi di applicazioni. Quando ho cercato di creare dynamic oggetto e impostare è proprietà come di seguito:Come creare il proprio tipo dinamico o oggetto dinamico in C#?

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

Ho RuntimeBinderException con il messaggio del proprietario o indicizzatore '<> f__AnonymousType0.A' non può essere assegnato ad - è solo leggere nella riga 2. Inoltre suggerisco che non è proprio quello che sto cercando. Forse c'è qualche classe che può permettermi di fare qualcosa del tipo:

??? MyDynamic = new ???(); 
MyDynamic.A = "A"; 
MyDynamic.B = "B"; 
MyDynamic.C = DateTime.Now; 
MyDynamic.TheAnswerToLifeTheUniverseAndEverything = 42; 

con aggiunta dinamica e proprietà di impostazione.

risposta

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

più informazioni ExpandoObject class e più campioni: Rappresenta un oggetto cui membri possono essere aggiunti e rimossi dinamicamente in fase di esecuzione.

+2

prega di votare per questa funzione in Visual Studio [UserVoice] (https: //visualstudio.uservoice. com/forum/121579-visual-studio/suggerimenti/7062098-supporto-oggetto-inizializzatori-on-expandoobjects). – orad

28

ExpandoObject è quello che stai cercando.

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

È possibile utilizzare ExpandoObject Class che è in 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++; }); 

Ulteriori informazioni sono disponibili all'indirizzo ExpandoObject MSDN

15

Recentemente ho avuto la necessità di prendere questo un ulteriore passo avanti, che era quello di rendere le aggiunte di proprietà in oggetto dinamico, dinamica se stessi, sulla base di definite dall'utente inserimenti. Gli esempi qui, e da Microsoft's ExpandoObject documentation, non indirizzano in modo specifico l'aggiunta di proprietà dinamicamente, ma possono essere ipotizzati da come si enumerano e si cancellano le proprietà. Ad ogni modo, ho pensato che questo potesse essere utile a qualcuno. Ecco una versione estremamente semplificata di come aggiungere le proprietà dinamiche veramente a un ExpandoObject (ignorando parola chiave e la manipolazione):

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