用多态 类 替换枚举:如何从 WPF/C# 中的 UI 中 select 类型?

Replacing enums with polymorphic classes: how to select types from the UI in WPF / C#?

据了解,在大多数情况下,使用子 class 的多态集优于使用 enumswitch。我遇到问题的部分是用可用类型填充 ListBoxComboBox。将列表框绑定到枚举相对简单,但是如何在完全避免枚举的情况下做同样的事情呢?

更具体地说,如果我有

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 中的值。