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

Why does casting to dynamic list fails when indexing?

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

(简化的代码片段)

List<Foo> foos = GetFoos();
List<dynamic> dynamicFoos = foos.Cast<dynamic>().ToList();
foreach (var foo in dynamicFoos)
{
  var Value = foo["Name"]; // fail
}

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

List<dynamic> dynamicFoos = foos.Select(f=> ConvertToDynamic(f)).ToList();
foreach (var foo in dynamicFoos)
{
  var Value = foo["Name"]; // Succeeded
}

使用方法:

private dynamic ConvertToDynamic(Foo foo){
  string Json = JsonConvert.SerializeObject(Foo);
  dynamic dynamicFoo = JsonConvert.DeserializeObject(Json);
  return dynamicFoo;
}

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

.Net Fiddle https://dotnetfiddle.net/aTZbZm(基于来自@Fildor 评论的link)

有人可以解释为什么转换行为不同于序列化吗? 或者提供更好的解决方案?

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

  • 如果这种情况比较少见,反射会更快更容易使用。只需按名称获取 属性 并正常获取其值。积极的缓存将允许您在感觉到它的性能受到影响之前更多地使用它。

  • 如果这将是 运行 非常大量的时间,那么实现动态编译器调用站点的成本将全部摊销并开始值得。不过,第一个 运行 会很粗糙。至于实际实现,您想构建一个 ExpandoObject dynamic,它在内部使用 Dictionary 个 属性 名称作为值。在使用之前你必须手动填写那个字典,它不是像演员那样简单。

您的序列化-反序列化方法比上述两种方法都差,因为它执行的操作(字符串操作和解析)比必要的多得多。但从概念上讲,它更类似于 #1,因为它没有实现 ExpandoObjects.