用多态 类 替换枚举:如何从 WPF/C# 中的 UI 中 select 类型?
Replacing enums with polymorphic classes: how to select types from the UI in WPF / C#?
据了解,在大多数情况下,使用子 class 的多态集优于使用 enum
和 switch
。我遇到问题的部分是用可用类型填充 ListBox
或 ComboBox
。将列表框绑定到枚举相对简单,但是如何在完全避免枚举的情况下做同样的事情呢?
更具体地说,如果我有
class MyBase
class A : MyBase
class B : MyBase
class C : MyBase
如何在 UI 上显示一个列表框,其中包含每个 class 的文本描述...类似
This is Class A
This is Class B
This is Class C
和 有一个 class B
的实例在用户选择列表中的第二项后创建?
谢谢
您可以使用反射获取继承自 MyBase
的类型:
var baseType = typeof(MyBase);
var types = Assembly.GetExecutingAssembly()
.GetTypes()
.Where(x => baseType.IsAssignableFrom(x));
那么剩下的就简单了,比如你可以有一个键值对列表,其中 Key
是 class 类型, Value
是类型的描述,并将 ValueMember
设置为 Key
,将 DisplayMember
设置为 Value
:
Assembly.GetExecutingAssembly()
.GetTypes()
.Where(x => typeof(MyBase).IsAssignableFrom(x));
.Select(x => new KeyValuePair<Type, string>(x,"This is " + x.Name))
.ToList();
然后处理SelectedChanged
事件,得到SelectedValue
,转换为Type
,使用Activator.CreateInstance
创建实例
我会覆盖 class 实例的 ToString 方法。
您的列表框应显示 ToString 结果。
因此,将 ListBox 的 ItemsSource 设置为 class 实例的 ObservableCollection,并依靠 ToString 来显示 listBox 中的值。
据了解,在大多数情况下,使用子 class 的多态集优于使用 enum
和 switch
。我遇到问题的部分是用可用类型填充 ListBox
或 ComboBox
。将列表框绑定到枚举相对简单,但是如何在完全避免枚举的情况下做同样的事情呢?
更具体地说,如果我有
class MyBase
class A : MyBase
class B : MyBase
class C : MyBase
如何在 UI 上显示一个列表框,其中包含每个 class 的文本描述...类似
This is Class A
This is Class B
This is Class C
和 有一个 class B
的实例在用户选择列表中的第二项后创建?
谢谢
您可以使用反射获取继承自 MyBase
的类型:
var baseType = typeof(MyBase);
var types = Assembly.GetExecutingAssembly()
.GetTypes()
.Where(x => baseType.IsAssignableFrom(x));
那么剩下的就简单了,比如你可以有一个键值对列表,其中 Key
是 class 类型, Value
是类型的描述,并将 ValueMember
设置为 Key
,将 DisplayMember
设置为 Value
:
Assembly.GetExecutingAssembly()
.GetTypes()
.Where(x => typeof(MyBase).IsAssignableFrom(x));
.Select(x => new KeyValuePair<Type, string>(x,"This is " + x.Name))
.ToList();
然后处理SelectedChanged
事件,得到SelectedValue
,转换为Type
,使用Activator.CreateInstance
创建实例
我会覆盖 class 实例的 ToString 方法。 您的列表框应显示 ToString 结果。
因此,将 ListBox 的 ItemsSource 设置为 class 实例的 ObservableCollection,并依靠 ToString 来显示 listBox 中的值。