如果标题的措辞不正确,请原谅我。如何在工厂返回T时访问值列表<T>以及未知
我从各种设备的数据库表中检索数据并构建一个列表。不同的设备可能具有相同的属性,并且肯定会有一些不同的属性,所以我使用工厂模式在运行时创建需要的任何一个。
工厂类:
public interface IImportModel
{
IList CreateImportList(SqlDataReader reader);
}
和混凝土类:
public class Device1ImportModel : IImportModel
{
public string SerialNumber { get; set; }
public string PartA { get; set; }
public IList CreateImportList(SqlDataReader reader)
{
Device1ImportModel linkedItem = new Device1ImportModel();
List<Device1ImportModel> importList = new List<Device1ImportModel>();
while (reader.Read())
{
linkedItem = new Device1ImportModel();
linkedItem.SerialNumber = reader["SerialNo"].ToString();
linkedItem.PartA = reader["PartA"].ToString();
importList.Add(linkedItem);
}
return importList;
}
}
我从工厂创建设备:
importModel = ImportModelFactory.CreateImportModel("Device1");
现在,当我想遍历importModel,我在尝试访问item.SerialNumber的行上收到编译时错误。
foreach (var item in importList)
{
string number = item.SerialNumber;
}
错误:
'object' does not contain a definition for 'SerialNumber' and no extension method 'SerialNumber' accepting a first argument of type 'object' could be found.
如果我把一个断点和项目变量悬停,我能看到的属性和价值。
我尝试使用动态而不是var,但后来在我的代码中,我不能再使用Linq或Lambda查询。
- 如何访问这些值?
- 我可以使用反射将IList转换为List吗?
编辑1
添加的代码为CreateImportModel:
static public IImportModel CreateImportModel(DeviceType device)
{
switch (device)
{
case DeviceType.Device1:
return new Device1ImportModel();
case DeviceType.Device2:
return new DeviceImportModel();
default:
return null;
}
}
请包含'CreateImportModel'的源代码。 – mjwills
所有设备类型是否都有'SerialNumber'? – mjwills