如何根据对象的类型创建WinForms组件

时间:2009-08-04 09:33:54

标签: c# winforms user-controls types

假设我们有这个界面:

interface IVehicle { ... }

一些实现它的类:

class Car : IVehicle { ... }
class Boat : IVehicle { ... }
class Plane : IVehicle { ... }

在我的用户界面中,我有一个FlowLayoutPanel,可以访问某种带有多个IEnumerable<IVehicle>对象的IVehicle

现在我想为每辆车创建一个UserControl并将其添加到FlowLayoutPanel。控制装置有点类似,但由于有不同类型的车辆,一些控制装置可能需要略微不同或以不同的方式工作,以便用户可以轻松地使用他的车辆。如何在没有太多混乱的情况下最好地解决这个问题?

4 个答案:

答案 0 :(得分:2)

如何使用某种工厂方法:

UserControl CreateControl(IVehicle vehicle) 
{
    if (vehicle is Car)
    {
        return new CarControl();
    }
    else if (vehicle is Boat)
    {
        return new BoatControl();
    }
    ...
}

答案 1 :(得分:2)

在界面IVehicle中,您可以添加一个方法来获取用户控件。

public interface IVehicle
{
    UserControl GetVehicleControl();
}

如果您需要为每辆车控制,您可以使用以下代码:

public class Car : IVehicle
{
    public UserControl GetVehicleControl()
    {
         return new CarControl();
    }
}

否则,如果每种车型只需要一个控件:

public class Car : IVehicle
{
    private static CarControl m_control;

    public UserControl GetVehicleControl()
    {
         if(m_control == null)
             m_control = new CarControl();

         return m_control;
    }
}

答案 2 :(得分:1)

我不确定您的目标究竟是什么,但是当您以通常的方式扩展用户控件时,您可以使用泛型:

public class VehicleControl<TVehicle>: UserControl
where TVehicle:IVehicle
{
  //do something specific with IVehicle 
}

public class CarControl : VehicleControl<Car>
{
  //add stuff specific for the Car
}

答案 3 :(得分:0)

如果您知道在编写代码时的映射方式,可以使用映射设置Dictionary

private Dictionary<Type, Type> _vehicleToControlTypeMappings = new Dictionary<Type, Type>();

启动时加载映射:

_vehicleToControlTypeMappings.Add(typeof(Car), typeof(CarControl));
_vehicleToControlTypeMappings.Add(typeof(Plane), typeof(PlaneControl));

...并提供一种基于车辆获取新控件的方法:

private Control GetVehicleControl(IVehicle vehicle)
{
    Control result = (Control)Activator.CreateInstance(
        _vehicleToControlTypeMappings[(vehicle as object).GetType()]
        );
    // perform additional initialization of the control
    return result;
}

然后,您只需将实现IVehicle的类型的对象传递给方法:

IVehicle vehicle = new Car();
Control newctl = GetVehicleControl(vehicle);