我正在編寫一個遊戲編輯器,並且有許多不同的「工具」對象。它們都從BTool繼承,並具有相同的構造函數。動態創建運行時從基類繼承的對象
我想動態地在運行時用對應於這些工具的按鈕填充工具箱,點擊後讓它們創建該工具的一個實例並將其設置爲當前工具。
這是可能的,如果是這樣,比用手創建這些按鈕更好還是更容易?
我正在編寫一個遊戲編輯器,並且有許多不同的「工具」對象。它們都從BTool繼承,並具有相同的構造函數。動態創建運行時從基類繼承的對象
我想動態地在運行時用對應於這些工具的按鈕填充工具箱,點擊後讓它們創建該工具的一個實例並將其設置爲當前工具。
這是可能的,如果是這樣,比用手創建這些按鈕更好還是更容易?
是的。
要查找的工具,你可以調用Assembly.GetTypes
:
var toolTypes = typeof(Tool).Assembly.GetTypes()
.Where(t => typeof(Tool).IsAssignableFrom(t))
.ToArray();
要創建的工具,您可以撥打Activator.CreateInstance
:
obj = Activator.CreateInstance(type, arg1, arg2);
如果您使用.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;
}
}
您必須實例化每個對象。
然而,就可以實現「點擊」方法爲一組按鈕的,是這樣的:
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);
}
謝謝,好和容易,正是我通緝! – 2010-04-27 02:39:33