C # 4: Реальный пример динамических типов - PullRequest
63 голосов
/ 13 февраля 2010

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

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

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

Ответы [ 6 ]

64 голосов
/ 13 февраля 2010

Есть много случаев, когда вы уже используете динамическую типизацию и динамическое связывание сегодня . Вы просто не понимаете этого, потому что все это скрыто за строками или 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 / текстовом редакторе.

3 голосов
/ 04 июня 2010

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

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

3 голосов
/ 13 февраля 2010

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

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

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

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

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

2 голосов
/ 15 мая 2010

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

Повышение исключений привязки в WPF и Silverlight с .net 4.0 Dynamics

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

2 голосов
/ 13 февраля 2010

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

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

1 голос
/ 13 февраля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...