如何获取继承相同接口的对象列表

本文关键字:接口 对象 列表 继承 何获取 获取 | 更新日期: 2023-09-27 17:59:18

假设我有一个名为ICar的接口,它由两个类实现; BMWAudi.它们包含名称和内容(汽车的可视化(。我想获得"宝马"和"奥迪"的名称,并将它们列在组合框中。因此,一旦用户选择名称,就应该显示对象内容。这是我到目前为止所做的。

interface ICar{
    String Name {get;}
    object Content{get;}
}

它由两个类继承,AudiBMW

class Audi : ICar{
    AudiCar audi = new AudiCar();
    String Name{get {return"Audi";}}
    object Content{get {return audi;}}
}

class BMW : ICar{
    BMWCar bmw = new BMWCar();
    String Name{get {return"BMW";}}
    object Content{get {return bmw;}}
}

BMWCarAudiCar都有宝马和奥迪汽车的可视化。

MainModel课上,

Class MainModel{
    List<ICar> cars;
    ICar selectedCar;
    MainModel(IEnumerable<ICar> cars){
        this.cars = new List<ICar>(cars);
        this.selectedCar = this.cars.FirstOrDefault();
    } 
    IList<ICar> Cars {get{return this.cars;}}
    public object Car{
        get{ return this.selectedCar.Content;}
    }
}

在 XAML 中,

xmlns:local="clr-namespace:WpfApplication1"
<ComboBox ItemsSource="{Binding Cars}" DisplayMemberPath="Name" SelectedItem="{Binding SelectedCar, Mode=TwoWay}" />

但我没有在组合框中获得两个值"奥迪"和"宝马"。请告诉我是否做错了什么。

如何获取继承相同接口的对象列表

获取实现接口的类的列表:

  • 确定要在哪个程序集中查找实现ICar的类型
  • 获取该程序集中的所有类型
  • 确定哪些类型实现ICar

下面是一个示例。为了演示,我正在寻找与接口(ICar(相同的程序集中的类。

var assembly = Assembly.GetAssembly(typeof (ICar));
var typesInAssembly = assembly.GetTypes();
var matching = typesInAssembly
    .Where(type => typeof(ICar).IsAssignableFrom(type) && !type.IsInterface);
// Checking !type.IsInterface or else it also returns ICar.

请使用observableCollection而不是List。

Class MainModel{
    List<ICar> cars;
    ICar selectedCar;
    ShowData(IEnumerable<ICar> cars){
        foreach (var car in cars)
            {
                _car.Add(car);
            }
        this.selectedCar = this.cars.FirstOrDefault();
    } 
     private ObservableCollection<Car> _cars=new ObservableCollection<Car>();
        public ObservableCollection<Car> Cars
        {
            get { return _cars; }
            set { _cars= value; }
        }
    public object Car{
        get{ return this.selectedCar.Content;}
    }
}