【问题标题】:List<> of objects, different types, sort and pull out types individually?List<> 对象,不同类型,单独排序和提取类型?
【发布时间】:2011-09-23 06:24:33
【问题描述】:

我有一些产品,任何、全部或没有可能与特定提交相关联。所有 7 种产品都是 Product 类的子类。我需要存储与提交相关的所有产品,然后在我的表示层上检索它们及其字段数据。我一直在使用List&lt;Product&gt;List&lt;object&gt;,但是当我使用OfType&lt;EPL(specific subclass)&gt; 时,我抛出一个错误,说我不能将systems.generic.IEnumerable&lt;EPL&gt; 隐式转换为类型“产品”。我试过投,但无济于事。

当我使用prodlist.OfType&lt;EPL&gt;(); 时没有错误,但是当我尝试将其存储在 EPL“tempEpl”的实例中时,我得到了上述与演员表相关的错误。是什么赋予了?代码如下。

 ProductService pserv = new ProductService();
    IList<object> prodlist = pserv.getProductById(x);

    EPL tempEpl = new EPL();

    if ((prodlist.OfType<EPL>()) != null)
    {            
       tempEpl = prodlist.OfType<EPL>();  // this throws a conversion error. 

    }

数据层

List<object> TempProdList = new List<object>();

    conn.Open();

    SqlCommand EplCmd = new SqlCommand(EPLQuery, conn);
    SqlDataReader EplRead = null;
    EplRead = EplCmd.ExecuteReader();

    EPL TempEpl = new EPL();
    if (EplRead.Read()) 
    {

        TempEpl.Entity1 = EplRead.GetString(0);
        TempEpl.Employees1 = EplRead.GetInt32(1);
        TempEpl.CA1 = EplRead.GetInt32(2);
        TempEpl.MI1 = EplRead.GetInt32(3);
        TempEpl.NY1 = EplRead.GetInt32(4);
        TempEpl.NJ1 = EplRead.GetInt32(5);
        TempEpl.PrimEx1 = EplRead.GetInt32(6);
        TempEpl.EplLim1 = EplRead.GetInt32(7);
        TempEpl.EplSir1 = EplRead.GetInt32(8);
        TempEpl.Premium1 = EplRead.GetInt32(9);
        TempEpl.Wage1 = EplRead.GetInt32(10);
        TempEpl.Sublim1 = EplRead.GetInt32(11);

        TempProdList.Add(TempEpl);
    }

【问题讨论】:

    标签: c# asp.net visual-studio oop


    【解决方案1】:

    这段代码没有意义:

    Product tempEpl = new EPL();
    
    if ((prodlist.OfType<EPL>()) != null)
    {            
       prodlist.OfType<EPL>();
    }
    
    • 不清楚你为什么要创建一个新的EPL() 开始
    • OfType() 永远不会返回 null - 它返回一个序列,可能为空
    • 根据 if 语句的正文,调用 OfType() 本身不会做任何有用的事情

    了解OfType() 返回的是一个序列,而不是单个项目,这一点很重要。我怀疑这就是你之前所缺少的。

    我怀疑你想要:

    Product tempEpl = prodList.OfType<EPL>().FirstOrDefault();
    

    如果prodList 中没有EPL 类型的元素,则这会将null 的值分配给tempEpl,否则列表中的第一个EPL 元素。

    (不清楚为什么要从数据层返回List&lt;object&gt;。为什么不是List&lt;Product&gt;?)

    【讨论】:

    • 会飞。谢谢。至于 if !null,我需要确定提交时是否附加了 EPL 产品。我想我可以使用新的 tempEpl 值运行该 if 语句。
    【解决方案2】:

    我认为在 DAL 中,而不是返回 Object 类型的列表,您应该返回 Product 类型的列表。如果这样做,则无需再次将其转换为 Product 类型。

    第二件事,在 PL 中,不要使用 IList,而是使用 List

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-20
      • 1970-01-01
      • 2010-10-13
      • 2012-10-20
      相关资源
      最近更新 更多