ExpandoObject可以作为一个列表吗?

5

我正在使用Json.Net将json结果反序列化为ExpandoObjects,使用以下代码:

    var converter = new ExpandoObjectConverter();

    dynamic d = JsonConvert.DeserializeObject<ExpandoObject>(json, converter);

这对于除了仅在json模式根部具有列表的响应之外的所有内容都非常有效,例如:

string json = @"[{""title"": ""the title""}]";

JsonConvert 的深处有这个方法:
public static T DeserializeObject<T>(string value, params JsonConverter[] converters)
{
    return (T)DeserializeObject(value, typeof(T), converters);
}
DeserializeObject 的返回值是一个包含一个 ExpandoObject 的正确构造的 List<object>,但代码尝试将该列表强制转换为一个 ExpandoObject 本身(T 的值),导致失败。

我有一个失败的单元测试,并可以修复它,但不确定如何直接将List插入到ExpandoObject中。

这个可能吗?DynamicObjectTryGetIndex,所以我认为一个 ExpandoObject 可以具有索引器。是否需要通过动态提供索引方法的实现来仔细构建类似于列表的 expando 实例,或者创建一个非 expando 的 DynamicObject 来保存列表并从动态方法调用中调用正确的方法呢?

1个回答

2
DynamicObject拥有TryGetIndex方法,所以我认为ExpandoObject可以拥有索引器。
不可以。你可以自己试一下,它会返回一个"RuntimeBinderException"的异常信息。
ExpandoObject并不是一个列表,它更像是一个字典。
你需要仔细构造类似于列表的Expando对象实例,通过动态提供一个索引方法来实现或者创建一个非Expando的DynamicObject来保存列表并从动态方法调用中正确调用方法吗?这是否必要?
好的,你可以创建一个自定义的DynamicObject,使其行为像一个列表,但我看不出来这样做的好处在哪里:你还不如使用普通的列表。

我正在尝试使用一个总是返回动态对象的 REST 客户端进行实验。只有最外层的消费者代码才会知道如果你知道我的意思,它期望一个列表。所以我将有一个用于列表的代码路径(client.GetList()),和另一个针对其他所有内容的代码路径(client.Get())。我想这并不是世界上最糟糕的事情。Json.Net 的 JObject 可以是一个列表,但我正在尝试避免它,因为它还有一些其他我不喜欢的行为。 - dkackman
你是对的。我需要给JSonConvert一个提示,这就是我缺少的:如果(content.StartsWith("[")) return JsonConvert.DeserializeObject<List<dynamic>>(content, converter);return JsonConvert.DeserializeObject<ExpandoObject>(content, converter); - dkackman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接