【问题标题】:Loop foreach over List of objects (cannot operate on variables of type 'object') [duplicate]在对象列表上循环foreach(不能对'object'类型的变量进行操作)[重复]
【发布时间】:2016-05-01 18:53:09
【问题描述】:

我正在尝试将一些对象保存到列表中以供以后使用。这是我存储它们的方式:

List<Engagement> engagementsList = new List<Engagement>();

foreach (Engagement engagement in db.Engagements)
{
    // Implementation here
}

TempData["DeletedE"] = engagementsList;
TempData.Keep();

然后,我尝试遍历列表,但出现错误:

不能对“object”类型的变量进行操作

我正在通过以下方式遍历列表:

foreach (Engagement e in TempData["DeletedE"])
{
    // Implementation here...
}

非常感谢任何帮助。

【问题讨论】:

    标签: c# list object foreach tempdata


    【解决方案1】:

    由于TempData["DeletedE"]object 类型,所以你不能枚举它。

    为此,您必须将其转换为 IEnumerable&lt;Engagement&gt;,如下所示:

    var enumerable = TempData["DeletedE"] as IEnumerable<Engagement>;
    
    foreach (Engagement e in enumerable)
    {
    
    }
    

    【讨论】:

    • 如何将元素“添加”到这个 IEnumerable?
    • 如果您需要添加项目,则转换为IList&lt;Engagement&gt;List&lt;Engagement&gt; 而不是IEnumerable&lt;Engagement&gt;
    • 您不想在视图中修改模型属性。
    【解决方案2】:

    MVC's TempData[] indexer returns an object,您无法对其进行迭代。

    您需要将其转换为您存储在其中的相同类型:

    foreach (var engagement in (List<Engagement>)TempData["DeletedE"])
    {
    }
    

    how to access an array element from tempdata 中也对此进行了说明。

    【讨论】:

    • 虽然这应该可行,但我在 for 循环中遇到错误:“对象引用未设置为对象的实例。” - 我想你不知道为什么会发生这种情况?
    • 无意冒犯,但请尝试搜索。这意味着某事是null,我怀疑是TempData["DeletedE"]。请记住 TempData 仅在一次重定向或一次控制器视图事务期间保留其值。
    • 未采取,我一直在调试它,但无法弄清楚,所以认为可能有一些我忽略了的东西,是的,临时数据已作为空值传递。
    • 如果您有兴趣,我决定改用 Session,现在一切正常 :)
    【解决方案3】:

    把你的循环改成这样:

    foreach (Engagement e in TempData["DeletedE"].Cast<Engagement>())
    {   
    }
    

    【讨论】:

    • 没有适用于objectCast&lt;T&gt;() 扩展方法。
    • 哦,我明白了,还不清楚 TempData 是什么类型,所以你必须先转换它。现在有一些正确答案
    猜你喜欢
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多