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


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

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

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

6 60

6 ответов:

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

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

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;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Scott Hanselman-C#4 и динамическое ключевое слово