2012-10-03 7 views
85

Dort ist zum Beispiel ViewBag Eigenschaft ControllerBase Klasse und wir können dynamisch Werte erhalten und setzen und fügen Sie eine beliebige Anzahl von zusätzlichen Feldern oder Eigenschaften zu diesem Objekt, das ist cool. Ich möchte so etwas über MVC-Anwendung und verwenden Controller Klasse in anderen Arten von Anwendungen. Als ich versuchte, dynamic Objekt zu erstellen und es ist Eigenschaft wie unten:Wie erstellt man in C# einen eigenen dynamischen Typ oder ein dynamisches Objekt?

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

I RuntimeBinderException mit Nachricht oder der Indexer haben ‚<> f__AnonymousType0.A‘ kann nicht zugewiesen werden - es ist nur lesen in Zeile 2. Auch ich schlage vor Es ist nicht ganz das, wonach ich suche. Vielleicht gibt es eine Klasse, die mir erlauben kann, etwas zu tun wie:

mit dynamischen Hinzufügen und Einstellen von Eigenschaften.

Antwort

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

mehr über ExpandoObject class Lesen und für mehr Proben: Stellt ein Objekt dar, dessen Mitglieder dynamisch hinzugefügt und zur Laufzeit entfernt werden kann.

+2

Bitte stimmen Sie für diese Funktion in Visual Studio [Uservoice] (https: //visualstudio.uservoice. com/forums/121579-Visual-Studio/Vorschläge/7062098-Support-Object-Initialisierer-on-expandoobjects). – orad

28

ExpandoObject ist was du suchst.

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

können Sie ExpandoObject Class verwenden, die in System.Dynamic Namespace ist.

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

Mehr kann Info bei ExpandoObject MSDN

15

finden Ich habe vor kurzem ein Bedürfnis hatte weiter noch einen Schritt zu nehmen, die, dynamisch sich, basierend auf Benutzer war, um die Eigenschaft Ergänzungen im dynamischen Objekt zu machen definiert Einträge. Die Beispiele hier und von Microsoft's ExpandoObject documentation adressieren nicht speziell dynamisch das Hinzufügen von Eigenschaften, sondern können davon ausgehen, wie Sie Eigenschaften auflisten und löschen. Jedenfalls dachte ich, dass dies für jemanden hilfreich sein könnte. Hier ist eine sehr vereinfachte Version, wie man hinzufügen wirklich dynamischen Eigenschaften einer ExpandoObject (ohne Berücksichtigung von Keyword und sonstige Hinweise zur Handhabung):

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