一个好的解决方案(一般来说 - 在您的特殊情况下可能不是最好的方法,但要判断这一点,我们需要更多信息)似乎将对象存储在 ComboBox 中,而不仅仅是字符串。这些对象应提供 ComboBox 中可见的文本以及运行您要调用的方法的方法。
在您的示例中,您似乎总是在调用实例的SetOutputState
方法OutPort
(假设此处的类名),因此您的 ComboBox 项目对象可能如下所示:
public class ComboItem
{
public ComboItem(string displayName, OutPort outPort)
{
this.displayName = displayName;
this.outPort = outPort;
}
private readonly string displayName;
private readonly OutPort outPort;
public override string ToString()
{
return displayName;
}
public OutPort OutPort {
get {
return outPort;
}
}
}
请注意,该ToString
方法的结果将是 ComboBox 中用户可见的字符串。
您必须像这样填充 ComboBox:
cmb_Motor.Items.Add(new ComboItem("OutPortA", NXT_Brick.OutPortA);
cmb_Motor.Items.Add(new ComboItem("OutPortB", NXT_Brick.OutPortB);
cmb_Motor.Items.Add(new ComboItem("OutPortC", NXT_Brick.OutPortC);
然后,您可以像这样评估所选项目:
ComboItem selectedItem = cmb_Motor.SelectedItem as ComboItem;
if (selectedItem != null) {
selectedItem.OutPort.SetOutputState();
}
如果您需要对所选项目执行的操作有更多变化,请将要执行的操作也移到ComboItem
类中:
public class ComboItem
{
public ComboItem(string displayName, OutPort outPort)
{
this.displayName = displayName;
this.outPort = outPort;
}
private readonly string displayName;
private readonly OutPort outPort;
protected OutPort OutPort {
get {
return outPort;
}
}
public override string ToString()
{
return displayName;
}
public virtual void DoWork()
{
outPort.SetOutputState();
}
}
该OutPort
物业现在不再需要公开;您可以简单地调用DoWork
所选项目。因此,评估代码可以更改为:
ComboItem selectedItem = cmb_Motor.SelectedItem as ComboItem;
if (selectedItem != null) {
selectedItem.DoWork();
}
对于需要不同操作的任何事情,您现在可以派生一个新类,该类ComboItem
会覆盖该DoWork
方法以执行不同的操作。