quot;Name: {obj.Name}, Age: {obj.Age}"); // Работает obj.Greet(); // Ошибка во время выполнения, если метода Greet не существует ``` #### Метод с `dynamic`: ```csharp public dynamic GetData() { return new { Identifier = "abc123", Version = 1 }; } dynamic data = GetData(); Console.WriteLine(data.Identifier); // Работает Console.WriteLine(data.MissingField); // Ошибка во время выполнения ``` #### Параметры и возвращаемые значения: ```csharp public void Process(dynamic input) { Console.WriteLine(input.SomeProperty); // Проверка только во время выполнения } dynamic value = new { SomeProperty = "Dynamic Value" }; Process(value); ``` --- ### Как работает `dynamic`? Ключевое слово `dynamic` основано на **Dynamic Language Runtime (DLR)** — подсистеме CLR (Common Language Runtime), которая позволяет компилировать и выполнять динамически типизированные языки. - Когда компилятор видит `dynamic`, он пропускает проверки на существование членов объекта. - Во время выполнения CLR вызывает методы или свойства через DLR, проверяя их наличие. --- ### Преимущества `dynamic`: 1. **Гибкость**: - Не нужно заранее знать структуру объекта. - Удобно работать с внешними библиотеками и данными без создания дополнительных типов. 2. **Упрощение кода**: - Уменьшение количества приведения типов (`cast`) или использования рефлексии. 3. **Поддержка динамических языков**: - Возможность взаимодействовать с кодом, написанным на языках с динамической типизацией. --- ### Недостатки `dynamic`: 1. **Потеря безопасности типов**: - Компилятор не проверяет правильность кода. Ошибки появляются только во время выполнения, что может быть сложно для диагностики. 2. **Падение производительности**: - Операции с `dynamic` выполняются через DLR, что делает их медленнее, чем операции со статически типизированными объектами. 3. **Отсутствие подсказок IntelliSense**: - При работе с `dynamic` в средах разработки (например, Visual Studio) нельзя получить подсказки о доступных свойствах и методах. --- ### Когда использовать `dynamic`? `dynamic` полезен в следующих случаях: - Работа с **JSON, XML или другими динамическими данными**, когда структура неизвестна. - Использование **рефлексии** для вызова методов или получения свойств. - Интеграция с библиотеками, которые возвращают нестатические данные (например, COM или библиотеки Python через IronPython). - Взаимодействие с динамическими API, такими как библиотеки автоматизации (например, Microsoft Office Interop). --- ### Пример: работа с JSON Если у вас есть JSON-объект, его можно обработать через `dynamic`: ```csharp using Newtonsoft.Json; string json = "{ \"Name\": \"Alice\", \"Age\": 25 }"; dynamic person = JsonConvert.DeserializeObject<dynamic>(json); Console.WriteLine(person.Name); // Alice Console.WriteLine(person.Age); // 25 ``` --- ### Альтернативы `dynamic`: Если вы можете использовать строгую типизацию, это предпочтительнее. Например, вместо `dynamic` можно использовать классы: ```csharp public class Person { public string Name { get; set; } public int Age { get; set; } } var person = JsonConvert.DeserializeObject<Person>(json); Console.WriteLine(person.Name); Console.WriteLine(person.Age); ``` --- ### Заключение: - `dynamic` — мощный инструмент для работы с данными, когда тип неизвестен заранее. - Это отличное решение для временного кода, но не рекомендуется использовать его повсеместно из-за отсутствия проверки типов и падения производительности. - Для долгосрочного кода предпочтительнее использовать статическую типизацию (`object`, классы, интерфейсы).