我有一些产品,任何,所有或任何一种产品都可能与特定提交相关联。所有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);
}
答案 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
。