列表与LT;>对象,不同类型,分类和拉出类型?

时间:2011-06-27 06:03:23

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

我有一些产品,任何,所有或任何一种产品都可能与特定提交相关联。所有7个产品都是产品类的子类。我需要存储与提交相关联的所有产品,然后在我的表示层上检索它们和它们的字段数据。我一直在使用List<Product>List<object>,但是当我使用OfType<EPL(specific subclass)>时,我会抛出一条错误消息,说我无法将systems.generic.IEnumerable<EPL>隐式转换为类型'产品'。我试过演员,但无济于事。

当我使用prodlist.OfType<EPL>();时没有错误,但当我尝试将其存储在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);
    }

2 个答案:

答案 0 :(得分:8)

这段代码毫无意义:

Product tempEpl = new EPL();

if ((prodlist.OfType<EPL>()) != null)
{            
   prodlist.OfType<EPL>();
}
  • 目前还不清楚为什么要创建新的EPL()
  • 开头
  • OfType()将永远不会返回null - 它返回一个可能为空的序列
  • 根据OfType()声明的正文
  • ,调用if本身不会做任何有用的事情。

了解OfType()返回序列而不是单个项目非常重要。我怀疑那是你以前缺少的。

我怀疑你想要:

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

如果null中没有tempEpl类型的元素,或者EPL中的第一个prodList元素,则会将EPL的值分配给List<object>另有说明。

(目前尚不清楚为什么要从数据层返回List<Product>来开始。为什么不是{{1}}?)

答案 1 :(得分:3)

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

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