Come creare il proprio tipo dinamico o oggetto dinamico in C #?


130

Ecco, ad esempio, la proprietà ViewBag della ControllerBaseclasse e possiamo ottenere / impostare in modo dinamico valori e aggiungere qualsiasi numero di campi o proprietà aggiuntivi a questo oggetto, il che è bello. Voglio usare qualcosa del genere, oltre all'applicazione MVC e alla Controllerclasse in altri tipi di applicazioni. Quando ho provato a creare un oggetto dinamico e impostarne la proprietà come di seguito:

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

Ho RuntimeBinderExceptioncon il messaggio Proprietà o indicizzatore '<> f__AnonymousType0.A' non può essere assegnato - è letto solo nella riga 2. Inoltre suggerisco che non è proprio quello che sto cercando. Forse c'è qualche lezione che può permettermi di fare qualcosa del tipo:

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

con proprietà dinamiche di aggiunta e impostazione.

Risposte:


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

Ulteriori informazioni sulla classe ExpandoObject e per altri esempi: rappresenta un oggetto i cui membri possono essere aggiunti e rimossi in modo dinamico in fase di esecuzione.


3
Si prega di votare per questa funzione in Visual Studio UserVoice .
orad,

33

Di recente ho avuto la necessità di fare un ulteriore passo avanti, che era quello di rendere le aggiunte di proprietà nell'oggetto dinamico, dinamiche stesse, sulla base di voci definite dall'utente. Gli esempi qui, e dalla documentazione di Microsoft ExpandoObject , non trattano specificamente l'aggiunta dinamica delle proprietà, ma possono essere ipotizzati dal modo in cui vengono enumerate ed eliminate le proprietà. Comunque, ho pensato che questo potesse essere utile a qualcuno. Ecco una versione estremamente semplificata di come aggiungere proprietà veramente dinamiche a un ExpandoObject (ignorando la parola chiave e l'altra gestione):

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

11

Puoi usare ExpandoObject Classquale si trova nello System.Dynamicspazio dei nomi.

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 su ExpandoObject MSDN


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


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

O il valore è presente

  var data = new { studentId, StudentName };
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.