我正在编写一个游戏编辑器,并且有很多不同的“工具”对象。它们都从BTool继承并具有相同的构造函数。
我想在运行时使用与这些工具对应的按钮动态填充工具箱,点击后让他们创建该工具的实例并将其设置为当前工具。
这是可能的,如果是这样,它会比手工创建这些按钮更好/更容易吗?
答案 0 :(得分:4)
是
要查找工具,您可以拨打Assembly.GetTypes
:
var toolTypes = typeof(Tool).Assembly.GetTypes()
.Where(t => typeof(Tool).IsAssignableFrom(t))
.ToArray();
要创建工具,您可以致电Activator.CreateInstance
:
obj = Activator.CreateInstance(type, arg1, arg2);
答案 1 :(得分:4)
如果你使用的是.NET 3.5,我会去看看MEF(Managed Extensibility Framework),如果你使用的是.NET 4.0,那么MEF已经内置了。
简而言之,这就是你所要做的一切。 (当然还有一些简单的代码可以“开始”组合。这一切都在上面链接的MEF网站上。)
[InheritedExport]
public abstract class BTool {
}
public class HandTool : BTool {
}
public class LassoTool : BTool {
}
public class Game {
[ImportMany]
public List<BTool> Tools {
get;
set;
}
}
答案 2 :(得分:0)
您必须实例化每个对象。
但是,您可以为一组按钮实现“单击”方法,例如:
List<BTool> theTools = new List<BTool>();
BTool mapTool1 = new MapTool1(); //assumes that MapTool1 inherits from BTool
BTool mapTool2 = new MapTool2();
//and so on
如果您使用的是WPF或WinForms,则确切的代码会略有不同。假设您正在使用WPF,您将在xaml中执行类似的操作:
<StackPanel Name="ToolButtons" /> //make sure to orient your tools how you like, vertical or horizontal
然后在WPF表单的构造函数中:
foreach (BTool b in theTools){
Button button = new Button();
button.Title = b.Name; //or .ToString, whatever
button.Clicked += b.ClickedEvent; //where ClickedEvent is a method in BTool that implements the interface for the Clicked event
ToolButtons.Children.Add(button);
}