如何获得继承相同接口的对象列表?
问题描述:
假设我有一个名为ICar
的接口,它由两个类实现; BMW
和Audi
。它们包含名称和内容(汽车的可视化)。我想获得名字“宝马”和“奥迪”,并将它们列入组合框。所以一旦用户选择对象内容应该出现的名称。这是我迄今为止所做的。如何获得继承相同接口的对象列表?
interface ICar{
String Name {get;}
object Content{get;}
}
它是由两个类,Audi
和BMW
继承。
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;}}
}
BMWCar
和AudiCar
有宝马和奥迪车的可视化。
在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;}
}
}
不知道答案,但我不知道你可以提供一个接口(C#5?)内的字段,所以最好的做法首先是有一个名为汽车的抽象类。 –
旁注:还使用内容的接口 –
@OriRefael C#接口确实允许定义属性。参考:http://*.com/questions/3754274/interface-class-with-getter-and-setter-in-c-sharp – Giggity