【问题标题】:How to handle type “Object {System.Collections.Generic.List<object>}”如何处理类型“对象 {System.Collections.Generic.List<object>}”
【发布时间】:2014-07-27 16:50:30
【问题描述】:

这是我第一次遇到这样的物体。

>Link of image of my local window during debug<

简单地说,我如何访问 CardNO 或 ItemID 的值,它们分别是 296 和 130,而“test”给出的唯一方法与普通对象完全一样,我不知道该转换什么它到。我什至不能做这个'test[0]'。

这就是“测试”的来源:

private void ListBoxIssue_OnDragEnter(object sender, DragEventArgs e)
    {
        var test = DragDropPayloadManager.GetDataFromObject(e.Data, typeof(CommsItem));
    }

【问题讨论】:

    标签: c# wpf object drag-and-drop


    【解决方案1】:

    使用

    var item = (CommsItem)((List<object>)test).FirstOrDefault();
    

    请务必在强制转换之前先检查 test 是否为 List&lt;object&gt; 的实例,以及 test[0] 是否为 CommsItem 的实例。

    【讨论】:

    • 你也可以var item = test.Cast&lt;CommsItem&gt;().FirstOrDefault();.
    • 是的,就是这样!我知道解决方案将是直截了当的!等待 10 分钟接受作为答案。同时...所以 test 是一个 List 的对象。这让我很困惑。这种情况的关键词是什么?我想对这个主题进行一些研究以完全掌握这个概念=)
    • test 是一个List&lt;object&gt; GetDataFromObject( 返回,但如果你知道“对象”真的是CommsItems,你可以转换它们(或者测试它们是否在之前)返回CommsItems.
    • @user3373225 目前我不确定testList&lt;T&gt; 还是object 的实例。所以,胡安是对的......但你仍然可以使用他和我的解决方案的混合来简化它:var item = ((List&lt;object&gt;)test).Cast&lt;CommsItem&gt;().FirstOrDefault();
    • 如果您想要第一个以外的元素,也可以使用ElementAt(x) 来获取类似于使用索引的元素 ([x]) var item = ((List&lt;object&gt;)test).Cast&lt;CommsItem&gt;().ElementAt(x);
    【解决方案2】:

    您需要将List&lt;Object&gt; 转换为List&lt;CommsItem&gt;

    例子:

    var test = DragDropPayloadManager.GetDataFromObject(e.Data, typeof(CommsItem)).Cast<CommsItem>().ToList();
    

    或者转换每个单独的元素:

    CommsItem element = (test[0] as CommsItem);
    

    这将返回转换为 CommsItemelement,除非它不是该类型或派生该类型,在这种情况下它将返回 null。

    所以要回答您的问题,您可以通过以下方式访问它们:

    string CardNO = (test[0] as CommsItem).CardNO;
    

    var test = DragDropPayloadManager.GetDataFromObject(e.Data, typeof(CommsItem)).Cast<CommsItem>().ToList();
    string CardNO = test[0].CardNO;
    

    (如果使用第一种方法,则不需要强制转换)

    您正在做的是将您的 List&lt;object&gt;test 转换为 List&lt;CommsItem&gt;,您可以使用它来访问属性,或者只是转换每个项目。

    【讨论】:

    • 在你的string CardNO = (test[0] as CommsItem).CardNO线上,你必须小心。您可以获得NullReferenceException,因为如果出于某种原因test[0] 不是CommsItem,则as 运算符将返回null,您将无法访问CardNO 上的CardNO 属性null .
    • 感谢您的意见!解决方案由 Juan Lopes 提供。正如我所说,对于你的, test[0] 只是不起作用。当我输入类似的内容时,它会说不能将索引应用于类型对象。因此,您的第一种方法也不起作用。没有“.cast”。它只是 .Equals .GetHashCode .GetType .ToString 就像一个普通的对象。
    • 确保在文件顶部包含using System.Linq,这样您就可以使用Cast() 和其他有用的方法。
    • @fourpastmidnight,我在答案中提到了这一点。 @user3373225,作为他提到的解决方案,您可以检查它是否等于 null 或使用 if (test[0] == null)
    • @user3373225 我很想知道为什么会这样,你试过List&lt;CommsItem test = DragDropPayloadManager.GetDataFromObject(e.Data, typeof(CommsItem)).Cast&lt;CommsItem&gt;().ToList(); 然后尝试使用索引吗?
    【解决方案3】:

    更简单:

    var item = ((List<object>)test).Cast<CommsItem>().FirstOrDefault();
    

    如果您的列表不是CommsItem 的列表,那么您将得到一个空列表。 FirstOrDefault() 确保您只获得第一项,如果没有第一项,则为该项的默认值(对于引用对象,这将是 null)。

    【讨论】:

    • 正如我对 Cyral 的回答一样,“测试”字面上提供的方法不超过 4 种,就像普通对象一样。没有 .cast
    • @user3373225 是的,我的误解。胡安有一个很好的解决方案。我已经编辑我的例子是正确的。他的或我的同样合适。很高兴我们能为您提供帮助。
    猜你喜欢
    • 2011-10-04
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    相关资源
    最近更新 更多