C# 4: реальный пример динамических типов

Я думаю, что у меня есть мозг, на полпути перенес Динамическое понятие Типов в C# 4, но не может ни за что в жизни выяснить сценарий, где я на самом деле хотел бы использовать его.

Я уверен, что существуют многие, но я просто испытываю затруднения при устанавливании связи относительно того, как я мог спроектировать решение, которое лучше решено с динамикой в противоположность интерфейсам, внедрению зависимости, и т.д.

Так, что такое реальный сценарий приложения, где динамическое использование типа является соответствующим?

65
задан Brandon 13 February 2010 в 00:27
поделиться

6 ответов

Есть много случаев, когда вы уже используете динамическую типизацию и динамическое связывание сегодня . Вы просто не понимаете этого, потому что все это скрыто за строками или System.Object , поскольку до C # 4 необходимой поддержки не было.

Одним из примеров является COM-взаимодействие: COM на самом деле является полудинамической объектной системой. Когда вы выполняете COM-взаимодействие, многие методы фактически возвращают динамический объект, но поскольку C # их не поддерживает, они возвращались как System.Object , и вам приходилось приводить их самостоятельно, возможно, перехватывая исключения на путь.

Другой пример - взаимодействие с динамически типизированными (или даже нетипизированными) данными, такими как JSON, CSV, HTML, XML без схемы, веб-сервисы без схемы, базы данных без схемы (которые, в конце концов, являются новой популярностью). Сегодня для этого используются струны. XML API будет выглядеть как

var doc = new XmlDocument("/path/to/file.xml");
var baz = doc.GetElement("foo").GetElement("qux");

и так далее. Но как насчет:

dynamic doc = new XmlDocument("/path/to/file.xml");
var baz = doc.foo.qux;

Разве это не выглядит красиво?

Третий пример - отражение. Сегодня вызов метода через отражение выполняется путем передачи строки в InvokeMember (или как там это называется).Разве не было бы лучше, знаете ли, просто вызвать эту чертову штуку?

Затем идет генерация динамических данных (в основном противоположность второму примеру). Вот пример того, как сгенерировать некоторый динамический XML:

dynamic doc = new XmlBuilder();
doc.articles(id=42, type="List", () => {
  article(() => {
    number(42);
    title("blahblubb");});});

Это не так красиво, как эквивалентный Ruby, но это лучшее, что я мог придумать за такое короткое время: -)

И последнее, но не менее важное. , интеграция с динамически типизированным языком. Будь то JavaScript в приложении Silverlight, механизм настраиваемых правил, встроенный в ваше бизнес-приложение, или экземпляр DLR, который вы размещаете в своей программе CAD / IDE / текстовом редакторе.

66
ответ дан 24 November 2019 в 15:31
поделиться

В MSDN есть один пример:

Многие методы COM позволяют изменять типы аргументов и возвращаемый тип, определяя типы как объект. Это потребовало явного приведения значений для координации со строго типизированными переменными в C #. Если вы компилируете с использованием параметра / link (параметры компилятора C #), введение динамического типа позволяет обрабатывать вхождения объекта в сигнатурах COM, как если бы они были динамического типа, и, таким образом, избежать большей части приведения типов.

Другой пример - взаимодействие с динамическими языками.

Также бывают случаи, когда вы хотите сделать некоторый код универсальным, но вы не можете этого сделать, потому что, хотя объекты реализуют один и тот же метод, они не имеют общего подходящего базового класса или интерфейса, который объявляет нужные вам методы. Примером этого является попытка сделать что-то общее с int и short. Это немного похоже на взлом, но динамический позволяет вам вызывать одни и те же методы для этих разных типов, что позволяет повторно использовать код.

Обновление: немного поискав здесь, нашел этот связанный пост .

3
ответ дан 24 November 2019 в 15:31
поделиться

Скотт Уотермасиск написал статью об использовании динамики для сопоставления словарных ключей и свойств в драйвере MongoDB C #.

http://simpable.com/code/mongodb-dynamics/

2
ответ дан 24 November 2019 в 15:31
поделиться

Я прочитал об этом интересную статью (прилагается) Скотта Хансельмана. Он указывает, что вместо использования объекта вы можете использовать динамические методы для ссылки на методы из старых COM-объектов, где компилятор не знает о существовании метода. Ссылка показалась мне полезной.

Скотт Хансельман - C # 4 и ключевое слово dynamic

1
ответ дан 24 November 2019 в 15:31
поделиться

Я думаю, что другие дали несколько замечательных ответов до сих пор, поэтому я просто хочу добавить этот пример Дэвида Хэнсона. Запись Hist показывает наиболее практичное применение, которое я нашел до сих пор для динамических типов в C#, где он использует их для создания прокси-объектов. В этом примере он создает прокси, который позволяет создавать исключения для ошибок привязки WPF. Я не уверен, что это также может быть достигнуто в случае привязок WPF с помощью CustomTypeDescriptors и концепций дескрипторов свойств в целом, но независимо от этого я думаю, что использование нового динамического типа C# 4.0 является отличной демонстрацией его возможностей.

Создание исключений привязки в WPF & Silverlight с помощью .net 4.0 Dynamics

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

2
ответ дан 24 November 2019 в 15:31
поделиться

Из блога Уолтера Алмейды: сценарий использования ключевого слова dynamic в C # для улучшения объектной ориентации:

http://blog.walteralmeida.com/2010/05/using-the -dynamic-keyword-in-c-to-Improve-objectorientation.html

3
ответ дан 24 November 2019 в 15:31
поделиться