2011-12-27 133 views
1

在其中包含一個匿名類型的對象鑄造匿名類型拋出鑄造錯誤

Application["userRecordsCountList"] = new ArrayList(); 

((System.Collections.ArrayList)Application["userRecordsCountList"]).Add(new { userCount = 12, logTime = DateTime.Now }); 
現在

在我的CS文件我有一個轉換函數,這是這樣的

我已經建立了我的Global.asax文件和數組列表
T Cast<T>(object obj, T type) 
{ 
    return (T)obj; 
} 

現在,當我運行的循環來遍歷數據,並提取數據集我得到一個錯誤 看到代碼的數據

ArrayList countRecord = new ArrayList((System.Collections.ArrayList)Application["userRecordsCountList"]); 

foreach (var item in countRecord) 
    { 
     dr = dt.NewRow(); 
     var record = Cast(item, new { userCount = "", logTime = "" }); 
     dr["Time"] = record.logTime; 
     dr["Users"] = record.userCount; 
     dt.Rows.Add(dr); 
    } 

誤差

Unable to cast object of type '<>f__AnonymousType0`2[System.Int32,System.DateTime]' to type '<>f__AnonymousType0`2[System.String,System.String]'. 

請幫我..我都想盡方法我在計算器或任何其它來源發現.....

日Thnx

+0

你閱讀的信息?你的類型是錯誤的。 – SLaks 2011-12-27 15:23:53

+0

你的方法'Cast()'的簽名/代碼是什麼? – 2011-12-27 15:24:59

+0

@SLaks這不是問題...運行代碼並自己檢查 – 1Mayur 2011-12-28 05:20:21

回答

6

不要使用匿名類型 - 使用您需要的實際類型。匿名類型只能在一個方法內使用 - 它們不能作爲參數返回,並且不適合一般的序列化。

此外,你不應該使用ArrayList - 它不是類型安全的。改爲使用像List<T>這樣的通用集合。

+0

ohk我會盡量不使用它..但我真的想知道這個問題的解決方案! – 1Mayur 2011-12-28 05:13:54

0

他們不兼容的類型。錯誤消息給出錯誤。一種是具有intDateTime屬性的匿名類型。第二個具有stringstring作爲屬性。

您只能投射到實際類型或基類,並且匿名類型沒有除object以外的基類,因此這是您可以投射到的唯一基礎類。

這可能是你想要什麼:

dr = dt.NewRow(); 
    dr["Time"] = item.logTime.ToString(); 
    dr["Users"] = item.userCount.ToString(); 
    dt.Rows.Add(dr); 

或者像奧德說,使用真正的類型。

+0

戴維你說的情況並不是什麼確切的錯誤是...請運行代碼並檢查 – 1Mayur 2011-12-28 05:12:46

+0

可以找到item.log時間這就是他錯誤是所有關於 – 1Mayur 2011-12-29 05:15:45

0

所述一個代碼中的證明不是匿名類型的理想的例子。我寧願使用匿名類型作爲方法級別的作用域,最好使用一些Linq。

雖然我同意爲每個對象組合創建一個類/模型是很麻煩的。因此,在你的情況下,你可以考慮使用一個通用的Pair類,只是將DateTime和int存儲在一個配對對象中。閱讀here

所以,你的收藏將成爲:

(List<Pair<int,DateTime>>Application["userRecordsCountList"]).Add(new Pair<int,DateTime>(12, DateTime.Now));