Jest na przykład właściwość klasy ViewBagControllerBase
i możemy dynamicznie pobierać / ustawiać wartości i dodawać dowolną liczbę dodatkowych pól lub właściwości do tego obiektu, co jest fajne. Chcę użyć czegoś takiego, poza aplikacją MVC i Controller
klasą w innych rodzaje aplikacji. Kiedy próbowałem stworzyć obiekt dynamiczny i ustawić jego właściwość jak poniżej:
1. dynamic MyDynamic = new { A="a" };
2. MyDynamic.A = "asd";
3. Console.WriteLine(MyDynamic.A);
Otrzymałem RuntimeBinderException
z wiadomością Właściwość lub indeksator '<> f__AnonymousType0.A' nie może być przypisany - jest odczytywany tylko w linii 2. Również sugeruję, że nie jest to do końca to, czego szukam. Może jest jakaś klasa, która pozwoli mi zrobić coś takiego:
??? MyDynamic = new ???();
MyDynamic.A = "A";
MyDynamic.B = "B";
MyDynamic.C = DateTime.Now;
MyDynamic.TheAnswerToLifeTheUniverseAndEverything = 42;
z dynamicznymi właściwościami dodawania i ustawiania.
Niedawno musiałem pójść o krok dalej, a mianowicie uczynić dodatki właściwości w obiekcie dynamicznym, same dynamiczne, w oparciu o wpisy zdefiniowane przez użytkownika. Przykłady tutaj oraz z dokumentacji ExpandoObject firmy Microsoft nie dotyczą w szczególności dynamicznego dodawania właściwości, ale można je wywnioskować na podstawie sposobu wyliczania i usuwania właściwości. W każdym razie pomyślałem, że to może być dla kogoś pomocne. Oto niezwykle uproszczona wersja sposobu dodawania prawdziwie dynamicznych właściwości do ExpandoObject (ignorując słowo kluczowe i inne sposoby obsługi):
// 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);
źródło
Add
metody? Wydaje mi się to dziwne.ExpandoObject
jest tym, czego szukasz.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;
źródło
Możesz użyć tego,
ExpandoObject Class
co jest wSystem.Dynamic
przestrzeni nazw.dynamic MyDynamic = new ExpandoObject(); MyDynamic.A = "A"; MyDynamic.B = "B"; MyDynamic.C = "C"; MyDynamic.SomeProperty = SomeValue MyDynamic.number = 10; MyDynamic.Increment = (Action)(() => { MyDynamic.number++; });
Więcej informacji można znaleźć w ExpandoObject MSDN
źródło
dynamic myDynamic = new { PropertyOne = true, PropertyTwo = false};
źródło
dynamic MyDynamic = new ExpandoObject();
źródło
var data = new { studentId = 1, StudentName = "abc" };
Lub wartość jest obecna
var data = new { studentId, StudentName };
źródło