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,但我不知道如何处理它才能将它用作一系列双打。

我尝试将其转换为双 [],但它也不起作用。

顺便说一句,我可以轻松检查是否在动态上定义了属性吗?

4

3 回答 3

3

.ToArray()不起作用的原因是它是扩展方法,并且扩展方法在运行时不可用。这只是意味着您必须静态调用该函数。Enumerable.ToArray<double>(data.newData)行得通吗?

您可能需要Enumerable.ToArray(Enumerable.Cast<double>(data.newData))取决于newData实际拥有的元素。

于 2010-11-12T13:23:38.233 回答
2

获取动态类型实例的属性

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

其中 dyn 是动态对象的一个​​实例。

于 2010-11-12T13:17:53.580 回答
1

您可以使用 JavaScriptSerializer 类将 Json 字符串解析为动态变量吗?例如:

var serializer = new JavaScriptSerializer();
var jsonObj = serializer.Deserialize<dynamic>(jsonString);
var newData1 = jsonObj["newData"][0];
于 2010-11-12T13:25:06.777 回答