它位于 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
浙公網安備 33010602011771號