Dynamic features в .NET 4.0

Одной из наиболее важной особенностью .NET 4.0 является поддержка динмаического типа. Давайте посмотрим что это такое.

Поддержка динамического типа стала возможной благодаря появлению ключевого слова dynamic. При объявлении динамического объекта можно обращаться к любому члену класса, при этом заранее не зная что это за класс (не зная типа). Например так:

static void DynamicMethod(object someObject)
{
    dynamic dynamicObject = someObject;
    dynamicObject.MyMethod();
}

В этом примере мы видим, что в метод приходит объект неизвестного нам типа и теперь, используя ключевое слово dynamic, мы можем вызывать любые методы и обращаться к любым свойствам объекта.

На самом деле в недрах .NET 4.0 для такой конструкции используется Reflection и поиск нужного члена класса с немного хитрым алгоритмом (кэшированием), но не будем о нем сейчас. Как вы понимаете, если у вызываемого объекта нету такого члена, то получим исключение в runtime. Поэтому нужно быть с dynamic осторожнее.

Что можно сделать еще? Можно передавать динамические объекты как параметр метода. Таким образом становится возможным передать в метод например объект анонимного типа.

static void Main(string[] args)
{
    DynamicMethod2(new { Id = 5, Name = "1234" });
}

static void DynamicMethod2(dynamic someObject)
{
    Console.WriteLine(someObject.Name);
}

Соответственно, этот код работает аналогично. Такие возможности .NET4.0 в первую очередь ориентированы на динамические языки и позволят работать с ними очень хорошо. Например, можем взять JSON-описание объекта и превратить его в нормальный объект .NET и с ним уже работать.

Ну и точно также мы можем вернуть динамический объект, например анонимный:

static dynamic DynamicMethod3()
{
    return new { Id = 555 };
}