dynamic (Справочник по C#)

Тип dynamic позволяет пропускать проверки типов во время компиляции операции, в которых он применяется . Вместо этого эти операции разрешаются во время выполнения. Тип dynamic упрощает доступ к API модели COM, например API автоматизации Office, к динамическим API, например библиотекам IronPython, и модели DOM HTML.

В большинстве случаев тип dynamic ведет себя так же, как object. Однако операции, которые содержат выражения типа dynamic, не разрешаются, или выполняется проверка типа компилятором. Компилятор пакует сведения об операции, затем эти сведения используются для оценки операции во время выполнения. Как часть процесса, переменные типа dynamic компилируются в переменные типа object. Поэтому тип dynamic существует только во время компиляции, но не во время выполнения.

В следующем примере переменная типа dynamic противопоставляется переменной типа object. Чтобы проверить тип каждой переменной во время компиляции, наведите указатель мыши на dyn или obj в операторах WriteLine. IntelliSense отображает dynamic для dyn и object для obj.

class Program
{
    static void Main(string[] args)
    {
        dynamic dyn = 1;
        object obj = 1;

        // Rest the mouse pointer over dyn and obj to see their 
        // types at compile time.
        System.Console.WriteLine(dyn.GetType());
        System.Console.WriteLine(obj.GetType());
    }
}

Инструкции WriteLine отображают типы времени выполнения dyn и obj. На этом этапе оба имеют одинаковый тип "целое число". Следующие выходные данные являются результатом:

System.Int32

System.Int32

Чтобы понять различие между dyn и obj во время компиляции, добавьте следующие две строки между объявлениями и операторами WriteLine в предыдущем примере.

dyn = dyn + 3;
obj = obj + 3;

При попытке добавления целого числа или объекта в выражение obj + 3 выводится ошибка компиляции. Однако нет сообщений об ошибках для dyn + 3 . Выражение, содержащее dyn, не проверяется во время компиляции, поскольку тип dyn задан как dynamic.

Контекст

Ключевое слово dynamic может отображаться непосредственно или как компонент сконструированного типа в следующих ситуациях:

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

    class ExampleClass
    {
        // A dynamic field. 
        static dynamic field;
    
        // A dynamic property.
        dynamic prop { get; set; }
    
        // A dynamic return type and a dynamic parameter type. 
        public dynamic exampleMethod(dynamic d)
        {
            // A dynamic local variable.
            dynamic local = "Local variable";
            int two = 2;
    
            if (d is int)
            {
                return local;
            }
            else
            {
                return two;
            }
        }
    }
    
  • В преобразованиях явного типа в качестве типа целевого объекта преобразования.

    static void convertToDynamic()
    {
        dynamic d;
        int i = 20;
        d = (dynamic)i;
        Console.WriteLine(d);
    
        string s = "Example string.";
        d = (dynamic)s;
        Console.WriteLine(d);
    
        DateTime dt = DateTime.Today;
        d = (dynamic)dt;
        Console.WriteLine(d);
    
    }
    // Results: 
    // 20 
    // Example string. 
    // 2/17/2009 9:12:00 AM
    
  • В любом контексте, где типы служат в качестве значений, например как типы с правой стороны оператора is или as, или как аргумент в typeof в качестве части сконструированного типа. Например, dynamic можно использовать в следующих выражениях.

    int i = 8;
    dynamic d;
    // With the is operator. 
    // The dynamic type behaves like object. The following 
    // expression returns true unless someVar has the value null. 
    if (someVar is dynamic) { }
    
    // With the as operator.
    d = i as dynamic;
    
    // With typeof, as part of a constructed type.
    Console.WriteLine(typeof(List<dynamic>));
    
    // The following statement causes a compiler error. 
    //Console.WriteLine(typeof(dynamic));
    

Пример

В следующем примере dynamic используется в нескольких объявлениях. Метод Main также противопоставляет проверку типов во время выполнения проверке типов во время компиляции.

using System;

namespace DynamicExamples
{
    class Program
    {
        static void Main(string[] args)
        {
            ExampleClass ec = new ExampleClass();
            Console.WriteLine(ec.exampleMethod(10));
            Console.WriteLine(ec.exampleMethod("value"));

            // The following line causes a compiler error because exampleMethod 
            // takes only one argument. 
            //Console.WriteLine(ec.exampleMethod(10, 4));

            dynamic dynamic_ec = new ExampleClass();
            Console.WriteLine(dynamic_ec.exampleMethod(10));

            // Because dynamic_ec is dynamic, the following call to exampleMethod 
            // with two arguments does not produce an error at compile time. 
            // However, itdoes cause a run-time error.  
            //Console.WriteLine(dynamic_ec.exampleMethod(10, 4));
        }
    }

    class ExampleClass
    {
        static dynamic field;
        dynamic prop { get; set; }

        public dynamic exampleMethod(dynamic d)
        {
            dynamic local = "Local variable";
            int two = 2;

            if (d is int)
            {
                return local;
            }
            else
            {
                return two;
            }
        }
    }
}
// Results: 
// Local variable 
// 2 
// Local variable

Дополнительные сведения и примеры см. в разделе Использование типа dynamic (Руководство по программированию на C#).

См. также

Задачи

Практическое руководство. Безопасное приведение с помощью операторов as и is (Руководство по программированию на C#)

Пошаговое руководство. Создание и использование динамических объектов (C# и Visual Basic)

Ссылки

object (справочник по C#)

is (Справочник по C#)

as (Справочник по C#)

typeof (справочник по C#)

ExpandoObject

DynamicObject

Другие ресурсы

Использование типа dynamic (Руководство по программированию на C#)