2010-11-12 25 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。

我試着將它作爲double []來投射,但它也不起作用。

另外,我可以輕鬆檢查一個屬性是否定義在動態上?

+0

當您嘗試此'data.newData.ToArray()'會發生什麼? – 2010-11-12 12:46:34

+0

var data2 = data.newData.ToArray(); --->'object'不包含'ToArray'的定義(也試過一些強制轉換) – 2010-11-12 12:49:54

回答

3

.ToArray()不起作用的原因是它是一種擴展方法,並且擴展方法在運行時不可用。這意味着你必須靜態調用這個函數。 Enumerable.ToArray<double>(data.newData)是否工作?

您可能需要Enumerable.ToArray(Enumerable.Cast<double>(data.newData)),具體取決於newData實際上具有哪些元素。

+0

是的! Enumerable.ToArray (data.newData)爲我完成這項工作:)感謝 – 2010-11-12 13:34:08

2

爲了得到一個動態型

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

其中達因是一個動態對象的一個​​實例的一個實例的屬性。

+0

這是一個有用的副本+可以代碼的代碼塊,我敢肯定它將成爲工作中的擴展方法... – 2012-05-21 20:29:49

1

您可以使用JavaScriptSerializer類將Json字符串解析爲動態變量嗎?例如:

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

+1的工作答案。這是因爲我的json在JsonResult中,我需要將它序列化爲一個字符串,然後將其反序列化爲一個動態的,所以不太理想。 – 2010-11-12 13:35:19