我有一个基本对象列表 (RTUDevice),我想遍历并将每个对象转换为派生对象(实际上是派生 RTDSensor 的派生对象),但是向下转换会引发错误。
public RTUDevice(int id)
{
_id = id;
}
public class RTDDevice : RTUDevice
{
public RTDDevice(int id)
: base(id)
{
}
}
public class RTDSensor : RTDDevice
{
public RTDSensor(int id)
: base(id)
{
}
}
RTDSensor return = (RTDSensor)_devices.Find(d => d.Id == p.ReturnId);
将构造函数中的基础对象传递给 RTDSensor 会不会更好
public RTDSensor(RTUDevice rtu) : base(rtu.Id)
{
}
或者是我的 OOP 设计方式偏离了目标。
最佳答案
问题可能出在您将设备添加到 _devices 集合的方式上。
例如:
RTDSensor sensor = new RTDSensor(1);
_devices.Add(sensor);
RTDSensor retrievedSensor = (RTDSensor)_devices.Find(d => d.Id == 1);
应该可以。但是,如果您将传感器添加为 RTUDevice 对象,则之后无法将其转换为 RTDSensor,因为它没有 RTDSensor 携带的附加信息。
引用 Jon Skeet 的例子你必须使用
object o = new FileStream(path, filemode);
FileStream fs = (FileStream)o;
如果您稍后想将 o 转换为 FileStream 对象。
关于c# - 构造函数中的基础对象作为向下转换的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1198984/