ExpandoObject可以成为一个列表吗?

dka*_*man 5 c# json dynamic-language-runtime json.net expandoobject

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

    var converter = new ExpandoObjectConverter();

    dynamic d = JsonConvert.DeserializeObject<ExpandoObject>(json, converter);
Run Code Online (Sandbox Code Playgroud)

除了在json模式的根目录下只有一个列表的响应之外,这对所有事情都很有用,例如:

string json = @"[{""title"": ""the title""}]";
Run Code Online (Sandbox Code Playgroud)

JsonConvert这个方法的内容:

public static T DeserializeObject<T>(string value, params JsonConverter[] converters)
{
    return (T)DeserializeObject(value, typeof(T), converters);
}
Run Code Online (Sandbox Code Playgroud)

返回值DeserializeObject是在其中正确构造的List<object>,ExpandoObject但代码无法尝试将该列表强制转换为ExpandoObject本身(T的值).

我有一个失败的单元测试,可以解决这个问题,但我不确定如何List直接填充ExpandoObject.

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

Tho*_*que 2

DynamicObject 有 TryGetIndex 所以我假设 ExpandoObject 可以有一个索引器

不,不能。只要尝试一下,它就会返回一个RuntimeBinderException

无法将 [] 索引应用于“System.Dynamic.ExpandoObject”类型的表达式

AnExpandoObject不是列表;它更像是一本字典。

是否有必要通过动态提供索引方法的实现来仔细构造一个类似列表的expando实例,或者创建一个非expando DynamicObject来保存列表并从动态方法调用中调用正确的方法?

好吧,您可以创建一个行为DynamicObject类似于列表的自定义项,但我认为这样做没有任何好处:您还不如使用普通列表。