я получил здесь класс, который выглядит следующим образом:Преобразование объекта общего абстрактного класса
public abstract class SIBRegisterHardware2<T> : Register.IRegisterHardware<UInt16, UInt16> where T : IDevice
{
protected T open()
{
// connect to server and return device T
}
// ..
}
public class Device : SIBRegisterHardware2<IDevice>
{
// ..
}
и некоторые производные классы:
internal class DeviceA: SIBRegisterHardware2<IDeviceA>
{
}
internal class DeviceB: SIBRegisterHardware2<IDeviceB>
{
}
Сейчас я ищу решение, которое позволяет мне это:
if(createDevA == true) {
Device<IDevice> devHandle = new DeviceA();
} else {
Device<IDevice> devHandle = new DeviceB():
}
дело в том, что такой код выдает ошибки так:
Cannot implicitly convert type 'DeviceA' to 'SIBRegisterHardware2<IDevice>'
Есть ли способ, который позволил бы мне отрисовать шаблон таким образом?
Что-то я опробовал создает еще один класс, который работает с отражением:
public class DeviceX : SIBRegisterHardware2<IDevice>
{
private Register.IRegisterHardware<UInt16, UInt16> device = null;
private Type deviceType = null;
public DeviceX (String hwInterfaceClassName)
{
if (hwInterfaceClassName.Equals("DeviceA")) {
device = new DeviceA();
deviceType = device.GetType();
}
else if (hwInterfaceClassName.Equals("DeviceB")) {
device = new DeviceB();
deviceType = device.GetType();
}
}
public override String doSomething(int param)
{
return (String)deviceType.GetMethod("doSomething").Invoke(device, new object[] { param }); ;
}
}
но является то, что аккуратный дизайн?
'' DeviceA' и DeviceB' не выводятся из 'Device'. Кроме того, 'Устройство' не является общим типом, и вы не можете записать' Device '. Я что-то пропустил? –
Dennis
спасибо за подсказку. Я добавил отсутствующий класс. – displayname