2010-04-27 88 views
2

我正在編寫一個遊戲編輯器,並且有許多不同的「工具」對象。它們都從BTool繼承,並具有相同的構造函數。動態創建運行時從基類繼承的對象

我想動態地在運行時用對應於這些工具的按鈕填充工具箱,點擊後讓它們創建該工具的一個實例並將其設置爲當前工具。

這是可能的,如果是這樣,比用手創建這些按鈕更好還是更容易?

回答

4

是的。

要查找的工具,你可以調用Assembly.GetTypes

var toolTypes = typeof(Tool).Assembly.GetTypes() 
    .Where(t => typeof(Tool).IsAssignableFrom(t)) 
    .ToArray(); 

要創建的工具,您可以撥打Activator.CreateInstance

obj = Activator.CreateInstance(type, arg1, arg2); 
+2

謝謝,好和容易,正是我通緝! – 2010-04-27 02:39:33

3

如果您使用.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; 
    } 

} 
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); 
}