如何访问ExpandoObject的Dynamic View数据并使集合直接对应该视图结构
如何访问ExpandoObject的Dynamic View数据并使集合直接对应该视图结构
嘿,我完全懂你的需求——你用ExpandoObject构建了一个数据集合,但想直接像调试器里的Dynamic View那样,用直观的属性访问方式操作数据,而不是每次都要把它当作IDictionary<string, object>或者ExpandoObject来处理,对吧?
其实解决方法很简单,核心就是利用C#的dynamic类型来匹配调试器里的Dynamic View行为:
第一步:修改集合的声明类型
把原来的List<object>改成List<dynamic>,这样集合里的每个ExpandoObject都会被当作动态类型处理,直接支持属性访问:
List<dynamic> example = new List<dynamic>();
第二步:保持原有构建逻辑不变
你原来构建ExpandoObject的代码不需要改动,因为ExpandoObject可以隐式转换为dynamic类型,直接添加到集合里就行:
foreach (var rate in rates) { var rateObject = new ExpandoObject() as IDictionary<string, object>; rateObject["Id"] = rate.Id; rateObject["RateType"] = rate.RateType; rateObject["Units"] = rate.R6Item.Unit.Symbol; rateObject["Schedule"] = rate.R6Item.Schedule.Description; rateObject["R6Code"] = rate.R6Item.Code; rateObject["R6Description"] = rate.R6Item.Description; rateObject["R7Code"] = rate.R7Item.Code; rateObject["R7Description"] = rate.R7Item.Description; rateObject["DICODE"] = rate.R6Item.Schedule.Discipline.Code; foreach (var currency in rate.Project.ProjectCurrencies) { rateObject[currency.Currency.Name] = currency.Currency.Name; } example.Add(rateObject); // 直接添加,自动转为dynamic }
第三步:直接像Dynamic View那样访问属性
现在你可以完全按照调试器里展示的结构,用点语法直接访问属性了:
// 访问固定属性 var firstId = example[0].Id; var firstRateType = example[0].RateType; // 访问动态添加的货币属性(比如USD、EUR这类) var usdValue = example[0].USD;
额外小技巧:检查属性是否存在
如果担心某些动态属性可能不存在,你可以把dynamic对象转回IDictionary<string, object>来做存在性检查:
dynamic item = example[0]; var itemDict = item as IDictionary<string, object>; if (itemDict.ContainsKey("USD")) { var usdValue = item.USD; // 或者 itemDict["USD"] }
原理其实很简单:调试器里的Dynamic View本质就是把ExpandoObject当作动态类型,展示它所有的键值对作为属性。而用dynamic类型声明集合,就是让编译器在运行时解析这些属性访问,和调试器的展示逻辑完全对齐,这样你就不用再绕弯子处理字典结构了。
备注:内容来源于stack exchange,提问作者lross33
相关产品推荐
相关产品推荐

