让我进一步解释一下。这是我正在尝试做的稍微详细一点的版本。您可以在这里看到我的抽象类具有指向派生类中正确方法的索引列表,并且您可以看到我在哪里加载类型并在 UI 中创建菜单项。我正在使用这个 ItemPointer 列表并传递 ItemPointers 以标记属性等。不知何故,这一切都感觉有点不对劲。
我希望整个事情都是可扩展的。我可能想添加一个 Class2、Class3 等都继承 BaseClass。我可能还想使用 BaseClass 创建插件。任何派生类都至少有一个可运行的方法,但可能会有很多。所以这里的 Class1 只是一个例子。这有助于解释我自己吗?请放轻松,我正在学习,这就是我在这里问的原因。
我在这里做的很糟糕吗?或者可以吗?或者,还有更好的方法?我想这是我的问题。如果有更好的方法,我真的很感激一个例子。非常感谢大家的帮助。非常感谢。
public abstract class BaseClass
{
public List<ItemPointer> ItemPointers = new List<ItemPointer>();
public abstract void Run(int index);
}
public class ItemPointer
{
public int Index { get; set; }
public string ClassType { get; set; }
public string UIDescription { get; set; }
}
public class Class1 : BaseClass
{
public Class1()
{
ItemPointers.Add(new ItemPointer { Index = 0, ClassType = this.GetType().Name, UIDescription = "MethodA Description" });
ItemPointers.Add(new ItemPointer { Index = 1, ClassType = this.GetType().Name, UIDescription = "MethodB Description" });
}
public override void Run(int index)
{
if (index == 0)
{
MethodA();
}
else if (index == 1)
{
MethodB();
}
}
private void MethodA()
{
//do stuff
}
private void MethodB()
{
//do stuff
}
}
public class UIForm
{
private List<BaseClass> _baseClasses;
//Formload events load all baseclass types (including plugins via reflection during form init etc. Then call loadUIitems
private void LoadUIItems()
{
foreach (BaseClass bc in _baseClasses)
{
foreach (var p in bc.ItemPointers)
{
ToolStripMenuItem t = new ToolStripMenuItem(p.UIDescription);
t.Click += new EventHandler(WorkerMenu_Click);
t.Tag = p;
actionsToolStripMenuItem.DropDownItems.Add(t);
}
}
}
void WorkerMenu_Click(object sender, EventArgs e)
{
ToolStripMenuItem t = (ToolStripMenuItem)sender;
ItemPointer p = (ItemPointer)t.Tag;
foreach (BaseClass bc in _baseClasses)
{
if (bc.GetType().Name == p.ClassType)
{
bc.Run(p.Index);
}
}
}
}