在我创建的Global.asax文件中,我创建了包含匿名类型对象的数组列表
Application["userRecordsCountList"] = new ArrayList();
((System.Collections.ArrayList)Application["userRecordsCountList"]).Add(new { userCount = 12, logTime = DateTime.Now });
现在在我的cs文件中我有一个像这样的
的转换函数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]'.
请帮帮我..我已经尝试过在stackoverflow或任何其他来源找到的每种方法.....
日Thnx
答案 0 :(得分:6)
不要使用匿名类型 - 使用您需要的实际类型。匿名类型只能在方法中使用 - 它们不能作为参数返回类型传递,并且通常不适合序列化。
此外,您不应使用ArrayList
- 它不是类型安全的。请改用List<T>
之类的通用集合。
答案 1 :(得分:0)
他们不兼容类型。错误消息给出错误。一种是具有int
和DateTime
属性的匿名类型。第二个是string
和string
作为属性。
您只能转换为实际类型或基类,而匿名类型不具有object
以外的基类,这样您才可以投射它们到。
这可能是你想要的:
dr = dt.NewRow();
dr["Time"] = item.logTime.ToString();
dr["Users"] = item.userCount.ToString();
dt.Rows.Add(dr);
或者如Oded所说,使用真实的类型。
答案 2 :(得分:0)
您的代码中演示的那个不是Anonymous类型的理想示例。我宁愿对方法级范围使用匿名类型,最好使用一些Linq。
虽然我同意为每个对象组合创建一个类/模型很麻烦。因此,在您的情况下,您可以考虑使用通用Pair类,只是为了在配对对象中存储DateTime和int。阅读here。
所以,你的收藏将成为:
(List<Pair<int,DateTime>>Application["userRecordsCountList"]).Add(new Pair<int,DateTime>(12, DateTime.Now));