Wie erstelle ich einen eigenen dynamischen Typ oder ein eigenes dynamisches Objekt in C #?


130

Es gibt zum Beispiel die ViewBag- Eigenschaft der ControllerBaseKlasse, und wir können dynamisch Werte abrufen / festlegen und diesem Objekt eine beliebige Anzahl zusätzlicher Felder oder Eigenschaften hinzufügen, was cool ist. Ich möchte so etwas jenseits der MVC-Anwendung und der ControllerKlasse in anderen verwenden Arten von Anwendungen. Als ich versuchte, ein dynamisches Objekt zu erstellen und seine Eigenschaft wie folgt festzulegen:

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

Ich habe RuntimeBinderExceptionmit der Nachricht Eigenschaft oder Indexer '<> f__AnonymousType0.A' kann nicht zugewiesen werden - es wird nur in Zeile 2 gelesen . Außerdem schlage ich vor, dass es nicht ganz das ist, wonach ich suche. Vielleicht gibt es eine Klasse, in der ich so etwas machen kann wie:

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

mit dynamischen Eigenschaften zum Hinzufügen und Einstellen.

Antworten:


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

Weitere Informationen zur ExpandoObject-Klasse und weitere Beispiele: Stellt ein Objekt dar, dessen Mitglieder zur Laufzeit dynamisch hinzugefügt und entfernt werden können.


3
Bitte stimmen Sie für diese Funktion in Visual Studio UserVoice ab .
Orad

33

Vor kurzem musste ich noch einen Schritt weiter gehen, indem ich die Eigenschaftsergänzungen im dynamischen Objekt basierend auf benutzerdefinierten Einträgen selbst dynamisch machte. Die Beispiele hier und in der ExpandoObject-Dokumentation von Microsoft befassen sich nicht speziell mit dem dynamischen Hinzufügen von Eigenschaften, sondern lassen sich aus der Aufzählung und dem Löschen von Eigenschaften ableiten . Jedenfalls dachte ich, das könnte jemandem helfen. Hier ist eine extrem vereinfachte Version des Hinzufügens wirklich dynamischer Eigenschaften zu einem ExpandoObject (Ignorieren von Schlüsselwörtern und anderen Handhabungen):

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

32

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;

11

Sie können verwenden, ExpandoObject Classwas im System.DynamicNamespace 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++; });

Weitere Informationen finden Sie unter ExpandoObject MSDN


9
dynamic myDynamic = new { PropertyOne = true, PropertyTwo = false};


7
 var data = new { studentId = 1, StudentName = "abc" };  

Oder Wert ist vorhanden

  var data = new { studentId, StudentName };
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.