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