czwartek, 28 lutego 2013

[C#|Visual Studio] C#: Konstrukcja dynamic i ExpandoObject

W języku C# od wersji 4.0 mamy do dyspozycji konstrukcję składniową zaczynającą się od słowa dynamic. Słowo to zapewnia dynamiczną typowalność, to znaczy, że typ takiej zmiennej zostanie ustalony nie na poziomie kompilacji (jak w przypadku słowa var), lecz w czasie pracy programu, stąd owa dynamiczność. Poniżej prosty przykład:

dynamic unknownVariable;
unknownVariable = "this is message";
Console.WriteLine(unknownVariable);
unknownVariable = DateTime.Now;
Console.WriteLine(unknownVariable);

Jeżeli zdarzy nam się, że na przykład do daty z powyższego kodu będziemy chcieli dodać liczbę, co nie jest dozwolonym działaniem, nie otrzymamy błędu kompilacji, ale wyjątek typu RuntimeBinderException, o którym dokumentacja MSDN mówi, że:
Represents an error that occurs when a dynamic bind in the C# runtime binder is processed.
Kolejnym ciekawym typem wykorzystywanym do dynamicznego typowania jest ExpandoObject. Obiekty takie pozwalają na dynamiczne typowanie pól obiektu, co znane jest z innych języków programowania, takich jak np. JavaScript.

dynamic expando = new ExpandoObject();
expando.val1 = "Another silly message";
expando.count = 911;
expando.Pi = 3.14;
foreach (var prop in expando)
{
    Console.WriteLine(prop.GetType());
    Console.WriteLine(prop);
}

Powyższy kod wypisze na konsoli następujące rzeczy:


Zatem widzimy, że ExpandoObject jest odpowiednim słownikiem, umożliwiającym składowanie obiektów dowolnego typu, ze względu na to, że w C# wszystko pochodzi od klasy object.
Aby pobrać pojedynczą wartość, wystarczy zrzutować obiekt dynamicznie typowany do słownika.

var singleValue = ((IDictionary<string, object>) expando)["val1"];

Brak komentarzy:

Prześlij komentarz