【问题标题】:How to get a list of objects that inherits the same interface?如何获取继承相同接口的对象列表?
【发布时间】:2016-07-31 08:25:58
【问题描述】:

假设我有一个名为ICar 的接口,它由两个类实现; BMWAudi。它们包含名称和内容(汽车的可视化)。我想获取名称“BMW”和“Audi”并将它们列在 Combo Box 中。因此,一旦用户选择名称,对象内容就会出现。这是我到目前为止所做的。

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}" />

但我没有在组合框中获得“Audi”和“BMW”这两个值。请告诉我是否做错了什么。

【问题讨论】:

  • 不知道答案,但我不确定您是否可以在接口(C# 5?)中提供字段,所以最好的做法是首先拥有一个名为 Car 的抽象类。
  • 旁注:也为内容使用接口
  • @OriRefael C# 接口允许定义属性。参考:stackoverflow.com/questions/3754274/…
  • @Giggity 我认为这是使用接口的错误方式......尤其是在这种情况下。
  • @OriRefael 先生,您为什么认为这是错误的?你能解释一下吗

标签: c# wpf xaml


【解决方案1】:

获取实现接口的类列表:

  • 确定要在哪个程序集中查找实现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.

【讨论】:

    【解决方案2】:

    请使用 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;}
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-21
      • 2019-01-31
      • 1970-01-01
      • 2014-12-24
      • 2019-08-06
      • 2016-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多