2011-12-27 86 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));