Как читать свойства из анонимных типов, используя «динамическую» переменную - PullRequest
4 голосов
/ 12 ноября 2010

У меня была хитрая идея использовать динамическую переменную для проверки результатов метода, который возвращает анонимный тип - точнее, он возвращает 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, но я не знаю, что с ним делать, чтобы можно было просто использовать его как массив значений типа double.

Я пытался привести его к двойному типу [], но он тоже не работает.

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

Ответы [ 3 ]

3 голосов
/ 12 ноября 2010

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

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

2 голосов
/ 12 ноября 2010

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

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

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

1 голос
/ 12 ноября 2010

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

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