2015-03-23 4 views
0

У меня есть конечная точка, которая позволяет мне получить верхний узел моего графика. Я также позволяют клиенту указать узлы, которые он хочет получить, что дети верхнего узла:Диаграмма динамического построения объектов

Например:

/libraries/5?with=banner|videos 

Это восстановит меня библиотеку с объектом баннерной и список видео ,

Я предоставляю полный язык запросов, поддерживающий вложенность. Например, если вы хотите такую ​​же структуру, но в том числе обложки и глав для каждого видео, которое вы бы просить это:.

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

Мне нужно построить объект динамически, когда приходит запрос, я имел взгляд на Clay, но проект кажется немного старым, и я уверен, что есть лучший способ создания объектов во время выполнения, чем использование ExpandoObject.

Если у кого-нибудь есть какие-либо идеи, я был бы вам очень признателен?

ответ

0

ExpandoObject - это способ назначения динамических свойств объекту.

Вы можете использовать словарь, но код может стать уродливым. Рассмотрим следующий пример -

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>(); 
0

C# не так хорошо в динамических объектов, которые по своему дизайну - его статически типизированный язык. Существует тип dynamic, который эмулирует статический доступ к другой динамической структуре (неизвестной во время компиляции). Вы можете использовать его для назначения и получения значений.

Если по конечной точке вы понимаете так веб-сервис, который возвращает json или xml, тогда вам не нужно создавать динамический объект, просто создавая ожидаемую структуру. Newtonsoft сериализатору для JSON-экземпляра могут прекрасно сериализовать словарь:

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

будет производить

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