它位于 System.Dynamic 命名空间中。与普通的 C# 类型不同,ExpandoObject 允许在运行时动态地添加、删除或修改其成员(属性或方法)。这使得它在一些需要高度灵活性和动态性的数据结构场景中非常有用。
ExpandoObject 的基本特性
动态成员访问:可以在运行时添加或移除属性和方法。
弱类型化:不像强类型的 C# 类,ExpandoObject 不需要在编译时定义其成员,这意味着编译时不会检查成员的存在。
字典访问:ExpandoObject 实现了 IDictionary<string, object> 接口,可以像使用字典一样访问其成员。
动态数据处理:在处理结构不固定的数据时,ExpandoObject 非常有用。例如,处理 JSON 数据,或者从 API 获取的不确定结构的数据时,可以使用 ExpandoObject 来方便地访问和操作这些数据。
using System; using System.Dynamic; class Program { static void Main() { dynamic expando = new ExpandoObject(); expando.FirstName = "John"; expando.LastName = "Doe"; // 添加新的属性 expando.Age = 25; // 动态方法 expando.FullName = (Func<string>)(() => $"{expando.FirstName} {expando.LastName}"); Console.WriteLine(expando.FullName()); // 输出: John Doe // 作为字典访问 var dictionary = (IDictionary<string, object>)expando; foreach (var kvp in dictionary) { Console.WriteLine($"{kvp.Key}: {kvp.Value}"); } } }
示例2
dynamic r = new ExpandoObject(); foreach (var i in list) { (r as ICollection<KeyValuePair<string, object>>).Add(new KeyValuePair<string, object>(i.SFA_ACTION_ID, i.ISSHOW == 0 ? false : true)); }
示例3
dynamic dynEO = new ExpandoObject(); dynEO.number = 10; dynEO.Increment = new Action(() => { dynEO.number++; }); Console.WriteLine(dynEO.number); dynEO.Increment(); Console.WriteLine(dynEO.number);
示例4 枚举所有成员
foreach (var property in (IDictionary<String, Object>)dynEO) { Console.WriteLine(property.Key + ": " + property.Value); }
示例5 接收属性的更改通知
static void Main(string[] args) { ……… ((INotifyPropertyChanged)dynEO).PropertyChanged += new PropertyChangedEventHandler(Program_PropertyChanged); dynEO.Name = "changed"; dynEO.Name = "another"; Console.ReadLine(); } static void Program_PropertyChanged(object sender, PropertyChangedEventArgs e) { Console.WriteLine("属性{0} 已更改", e.PropertyName); }
来源:https://blog.csdn.net/weixin_45497805/article/details/140142978
https://blog.csdn.net/WuLex/article/details/124546365