动态构建对象图

时间:2015-03-23 07:56:35

标签: c# dynamic object-graph

我有一个端点,可以让我获得图表的顶级节点。我还允许客户端指定他希望检索的节点是顶级节点的子节点:

例如:

/libraries/5?with=banner|videos

这将检索一个包含横幅对象和视频列表的库。

我提供了一种支持嵌套的完整查询语言。例如,如果您想要相同的结构,但包括每个视频的封面和章节,您可以请求:

/libraries/5?with=banner|videos[cover|chapters]

我需要在请求进入时动态构建对象。我看过Clay,但是项目看起来有点老了,我确信有更好的方法可以在运行时构建对象而不是使用ExpandoObject。

如果有人有任何想法,我会非常感激吗?

2 个答案:

答案 0 :(得分:0)

ExpandoObject是为对象分配动态属性的方法。

您可以使用Dictionary但代码可能会变得丑陋。请考虑以下示例 -

Dictionary<string, object> parent = new Dictionary<string, object>();
parent["known_prop"] = new List<object>();    
parent["dynamic_prop"] = new Dictionary<string, object>();
parent["dynamic_prop"]["some_value"] = new List<object>();

同样可以在ExpandoObject中以非常简洁的方式编写 -

var a = new ExpandoObject();
a.Prop1 = new List<Object>();
a.Prop2 = new ExpandoObject();
a.Prop2.Val = new List<Object>();

答案 1 :(得分:0)

C#在动态对象方面不是很好,这是设计的 - 它是静态类型语言。有dynamic类型模拟静态访问,否则动态(编译时未知)结构。您可以使用它来分配和检索值。

如果您通过端点了解返回json或xml的Web服务,那么您不需要创建动态对象,只需构建预期的结构。 Newtonsoft json serializer for-instance可以很好地序列化字典:

_dictionary.Add("banner", new Banner())

将产生

{
    "banner" : { ... banner properties ... }
}