ExpandoObject — это закрытый класс, который хранит данные в словаре. Он реализует интерфейс IDynamicMetaObjectProvider, который обеспечивает динамическое поведение реализующих его классов. Он также реализует интерфейс IDictionary, который обеспечивает поведение, подобное словарю. Предполагается, что он проверяется и проверяется во время компиляции.
dynamic — это тип, который не должен проверяться компилятором во время компиляции. Он проверяется и ломается во время выполнения. Во время компиляции предполагается, что динамический объект поддерживает любую операцию. Итак, когда вы говорите, что это объект Expando, поле, вызываемое первым, не добавляется к самому объекту.
Проверьте исходный код объекта Expando здесь
https://github.com/Microsoft/referencesource/blob/master/System.Core/Microsoft/Scripting/Actions/ExpandoObject.cs
Думайте о динамическом поведении как об объекте. Вы можете поставить любой тип там. Когда вы добавляете в список, вы добавляете в список как динамический, но неотъемлемым типом добавляемого элемента является ExpandoObject. Таким образом, вы можете вернуть его обратно в ExpandoObject.
Когда ты говоришь,
expandoObj1.first = "fred";
это то же самое, что сказать,
expandoObj1.Add("first", "fred");
Когда вы использовали
var expObj = expandoObj1;
var name = expObj.first;
вы использовали expandoObject в динамической форме. Таким образом, вы получили прямой доступ к свойствам. Когда вы приводили его к классу ExpandoObject, вы использовали фактический класс ExpandoObject, который хранит поля в словаре, поэтому запись через точку (.) не работает.
var expObj4 = peopleList[0] as ExpandoObject;
переменная с левой стороны по-прежнему является ExpandoObject, а не словарем. ExpandoObject предоставляет свои элементы через поиск по коллекции.
var name4 = expObj4.Where(t=>t.Key == "first").First().Value;
Когда вы переводите его в словарь, он работает как словарь.
IDictionary<string, object> expObj3 = peopleList[0] as ExpandoObject;
var name3 = expObj3["first"];
Когда вы приводите его к динамике, вы можете получить доступ к этим ключам, как если бы они были свойствами класса.
Дополнительная ссылка Динамическое добавление свойств в ExpandoObject
person
Amit Kumar Singh
schedule
31.08.2017
dynamic
, это важная часть! - person Lasse V. Karlsen   schedule 31.08.2017