2010-11-12 1 views
4

У меня была хитрое представление об использовании динамической переменной для проверки результатов метода, который возвращает анонимный тип, а точнее, возвращает JsonResult, который, как выглядит json этоКак читать свойства анонимных типов с использованием «динамической» переменной

{ "newData" : [ 1120741.2697475906, 
     826527.64681837813 
    ], 
    "oldData" : [ 1849870.2326665826, 
     1763440.5884212805 
    ], 
    "timeSteps" : [ 0, 
     4.8828124999999998e-10 
    ], 
    "total" : 2 
} 

Я могу прочитать JSonResult, который даст мне анонимный тип. Вот мой код:

var jsonResult = controller.GetChangeData(1) as JsonResult; 
dynamic data = jsonResult.Data; 
Assert.AreEqual(2, data.total); // This works fine :) 

Но как мне попасть, например, в «newData»? Этот код ....

var newData = data.newData; 

дает мне System.Linq.Enumerable.WhereSelectArrayIterator, но я не знаю, что делать с ним, чтобы иметь возможность просто использовать его в качестве Arry двойников.

Я пробовал использовать его как двойной [], но он тоже не работает.

Как в стороне, могу ли я легко проверить, определено ли свойство в динамике?

+0

Что происходит, когда вы пытаетесь использовать этот 'data.newData.ToArray()'? –

+0

var data2 = data.newData.ToArray(); ---> «object» не содержит определения для «ToArray» (тоже с некоторыми приведениями) –

ответ

3

Причина, по которой .ToArray() не работает, заключается в том, что это метод расширения, а методы расширения недоступны во время выполнения. Это просто означает, что вы должны вызвать функцию статически. Работает Enumerable.ToArray<double>(data.newData)?

Возможно, вам понадобится Enumerable.ToArray(Enumerable.Cast<double>(data.newData)) в зависимости от того, какие элементы newData на самом деле имеет.

+0

Да! Enumerable.ToArray (data.newData) выполняет эту работу для меня :) Спасибо –

2

Для того, чтобы получить свойство экземпляра динамического типа

PropertyDescriptorCollection props = TypeDescriptor.GetProperties(dyn); 
foreach (PropertyDescriptor prop in props) 
{ 
    object val = prop.GetValue(dyn); 
    var propName = prop.Name; 
    var propValue = val; 
} 

, где дин является экземпляром динамического объекта.

+0

Это была полезная копия + пассивный самородок кода, который я уверен, станет работать над расширением ... –

1

Можете ли вы использовать класс JavaScriptSerializer для синтаксического анализа строки Json в динамическую переменную? Например:

var serializer = new JavaScriptSerializer(); 
var jsonObj = serializer.Deserialize<dynamic>(jsonString); 
var newData1 = jsonObj["newData"][0]; 
+0

+1 за рабочий ответ. Проблема с этим заключается в том, что мой json был в JsonResult, мне нужно было сериализовать его на строку, а затем десериализовать его обратно в динамический, настолько менее идеальный. –