2012-10-03 17 views
85

Jest to na przykład właściwość ViewBag klasy ControllerBase 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 klasa w innych typach aplikacji. Kiedy próbowałem tworzyć dynamic obiekt i ustaw jego właściwość jak poniżej:Jak utworzyć własny typ dynamiczny lub obiekt dynamiczny w języku C#?

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

Mam RuntimeBinderException z komunikatem Nieruchomość lub indekser „<> f__AnonymousType0.A” nie może być przypisany do - to jest tylko czytać w linii 2. Sugeruję również, że nie jest to dokładnie to, czego szukam. Może jest jakaś klasa, która może pozwolić mi na zrobienie czegoś takiego:

z dynamicznymi właściwościami dodawania i ustawiania.

Odpowiedz

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

Więcej o ExpandoObject class i dla większej liczby próbek: Reprezentuje obiekt, którego członkowie mogą być dynamicznie dodawane i usuwane w czasie wykonywania.

+2

proszę głosować na tej funkcji w Visual Studio [UserVoice] (https: //visualstudio.uservoice. com/forums/121579-visual-studio/suggestions/7062098-support-object-initializers-on-expandoobjects). – orad

28

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; 
7
dynamic MyDynamic = new ExpandoObject(); 
9

Można użyć ExpandoObject Class który jest w System.Dynamic 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źć na stronie ExpandoObject MSDN

15

Niedawno miałem potrzebę podjęcia krok dalej, który miał dokonać uzupełnień nieruchomości w dynamicznym obiekcie, dynamiczny sami, na podstawie zdefiniowanych przez użytkownika wpisy. Przykłady tutaj i od Microsoft's ExpandoObject documentation nie odnoszą się konkretnie do dynamicznego dodawania właściwości, ale można się domyślić, jak wyliczyć i usunąć właściwości. W każdym razie myślałem, że to może być pomocne dla kogoś. Tutaj jest bardzo uproszczona wersja jak dodać właściwości prawdziwie dynamiczne do ExpandoObject (ignorując słowa kluczowego i innych manipulacji):

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