Когда и зачем мне использовать позднее связывание? (DynamicObject и ExpandoObject)

В то время как DynamicObjects и ExpandoObjects (Различия между ExpandoObject, DynamicObject и dynamic) кажутся весьма полезными поначалу я никогда ими не пользовался. Кажется, что поздняя привязка довольно небезопасна / нестабильна, поскольку она может вызывать ошибки во время выполнения, которых можно было бы избежать. В целом MSDN указывает на несколько преимуществ раннего связывания и предлагает по возможности не использовать позднее связывание (https://msdn.microsoft.com/en-us/library/0tcf61s1.aspx).

Поскольку у меня никогда не было ситуации, которую я не мог бы решить без позднего связывания, и поскольку это, кажется, считается «плохим стилем», я хотел бы знать, есть ли ситуации, которые действительно требуют использования позднего связывания. Есть ли у вас какие-либо примеры использования позднего связывания (в частности, DynamicObject или ExpandoObject), и у вас была веская причина для этого выбора дизайна, за исключением того, что его «легко кодировать»?


person H W    schedule 10.02.2015    source источник


Ответы (1)


В большинстве случаев лучше воздерживаться от использования dynamic и придерживаться типобезопасного стиля программирования.

Но бывают ситуации, когда использование dynamic может улучшить вашу жизнь или даже больше, может позволить вам делать действительно крутые вещи, которые были бы невозможны без dynamic.

ExpandoObject

Рассмотрим следующий пример (без использования ExpandoObject):

Dictionary<String, object> info = new Dictionary<string, object>();
Dictionary<String, object> person = new Dictionary<string,object>();
info["Person"] = person;
person["Name"] = "John";
person["Surname"] = "Smith";

Теперь с помощью ExpandoObject:

dynamic info = new ExpandoObject();
info.Person = new ExpandoObject();
info.Person.Name = "John";
info.Person.Surname = "Smith";

Разве так не лучше? Вы можете использовать ExpandoObject вместо словаря всякий раз, когда вам нужен какой-то пакет свойств для управления большими иерархиями объектов. Но если у вас есть простой небольшой словарь, наверное, лучше придерживаться словаря - он понятнее и нет накладных расходов на производительность.

DynamicObject

Теперь представьте, что у вас есть огромная иерархия объектов (скажем, исходящих из JSON). Вы можете создать собственный DynamicObject для простой десериализации JSON в динамический объект, см. Пример здесь . Вы можете делать еще много интересных вещей с DynamicObject!


Кроме того, DLR (и динамическая поддержка в C #) позволяет, например, выполнять динамические языки (например, IronRuby) из контекста C #.

Как видите, динамическая поддержка в C # - очень мощная концепция, но ее следует использовать только при необходимости.

person ialekseev    schedule 10.02.2015