首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么对动态列表的转换在索引时失败?

为什么对动态列表的转换在索引时失败?
EN

Stack Overflow用户
提问于 2021-05-31 12:24:49
回答 1查看 63关注 0票数 0

在获得异常后,当尝试使用索引器获取项值时,Cannot apply indexing with [] to an expression of type anonymous如下:

(简化代码片段)

代码语言:javascript
运行
复制
List<Foo> foos = GetFoos();
List<dynamic> dynamicFoos = foos.Cast<dynamic>().ToList();
foreach (var foo in dynamicFoos)
{
  var Value = foo["Name"]; // fail
}

我发现自己在写这个:(C#)

代码语言:javascript
运行
复制
List<dynamic> dynamicFoos = foos.Select(f=> ConvertToDynamic(f)).ToList();
foreach (var foo in dynamicFoos)
{
  var Value = foo["Name"]; // Succeeded
}

使用该方法:

代码语言:javascript
运行
复制
private dynamic ConvertToDynamic(Foo foo){
  string Json = JsonConvert.SerializeObject(Foo);
  dynamic dynamicFoo = JsonConvert.DeserializeObject(Json);
  return dynamicFoo;
}

这是可行的,但我确信有一种比反序列化序列化对象更好的做法。

.Net Fiddle https://dotnetfiddle.net/aTZbZm (基于@Fildor注释中的链接)

有人能解释为什么转换行为与序列化不同吗?或者给出一个更好的解决方案?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-31 14:25:21

您尝试的内容不起作用,因为对象的动态表示没有索引器(因为原始对象没有索引器)。你在这里有两个选择:

  • --如果这是比较少见的东西,反射就会更快、更容易使用。只需按名称获取属性并获得其正常值。主动缓存将允许您在感觉性能受到影响之前更多地使用它。

如果

  • 需要运行很长时间,那么实现动态编译器调用站点的成本就会被摊销,并且它开始变得值得了。不过,第一轮比赛将是艰难的。至于实际的实现,您需要构建一个ExpandoObject dynamic,它在内部使用属性名的Dictionary来表示值。在使用字典之前,您必须手动填写字典,它并不像强制转换那样简单。

您的序列化反序列化方法比上面的两个选项都糟糕,因为它所做的操作(字符串操作和解析)比必要的要多得多。但是,在概念上,它更类似于#1,因为它没有实现ExpandoObjects

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67773700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档