C# 4: реальный пример динамических типов
Я думаю, что мой мозг наполовину обернут вокруг концепции динамических типов в C# 4, но не могу за всю жизнь понять сценарий, в котором я действительно хотел бы его использовать.
Я уверен, что их много, но у меня просто возникли проблемы с подключением к тому, как я мог бы спроектировать решение, которое лучше решается с помощью динамики, а не интерфейсов, инъекций зависимостей и т. д.
Итак, что такое реальный сценарий приложения, в котором используется динамический тип уместно?
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# для улучшения ориентации объекта:
Scott Watermasysk написал статью об использовании dynamics для сопоставления ключевых свойств словаря на драйвере MongoDB C#.
Я думаю, что другие дали некоторые отличные ответы до сих пор, поэтому я просто хочу добавить этот пример Дэвида Хэнсона. Hist post показывает самое практическое приложение, которое я нашел до сих пор для динамических типов в C#, где он использует их для создания прокси-объектов. В этом примере он создает прокси, который позволяет создавать исключения на ошибки привязки WPF. Я не уверен, что это также может быть достигнуто в случае Привязок WPF с помощью CustomTypeDescriptors и концепций дескрипторов свойств в целом, но независимо от того, я думаю, что использование нового динамического типа C# 4.0 является отличной демонстрацией его возможностей.
создание исключений привязки в WPF & Silverlight с .net 4.0 Dynamics
еще одно использование, которое я могу придумать для динамических типов, - это создание прокси-серверов, которые аналогично могут быть подключены как DataContext в WPF или в других местах, где ожидается общий тип объекта, и методы отражения обычно используются для опроса типа. В подобных случаях особенно при построении тестов может использоваться динамический тип, который затем позволит вызывать методы доступа к свойствам и регистрировать их соответствующим образом прокси-объектом динамическим образом без необходимости жестко кодировать свойства в классе только для тестирования.