为什么在索引时转换为动态列表失败?
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
.
得到异常后
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
.