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.

Dmytro
quelle

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.

Mario Sannum
quelle
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);
AlienFromCA
quelle
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;
nothrow
quelle
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

Kishore Kumar
quelle
9
dynamic myDynamic = new { PropertyOne = true, PropertyTwo = false};
smedasn
quelle
7
dynamic MyDynamic = new ExpandoObject();
Davecz
quelle
7
 var data = new { studentId = 1, StudentName = "abc" };  

Oder Wert ist vorhanden

  var data = new { studentId, StudentName };
Felsen
quelle