我目前正在嘗試克隆我稱爲「Component」的XNA項目中的自定義類型,讓它看起來像這樣。創建新的泛型類型實例轉換爲根類型?
public static TComponent CloneComponent<TComponent>(this TComponent source) where TComponent : Component, new()
{
TComponent clone = new TComponent(); //Create the new instance
//Clone the source code here
return clone;
}
在我的項目,居然還有克隆代碼在我的方法,但由於它沒有任何關係我的問題做我刪除它。
對於我的組件類的一些解釋,我有根類稱爲Component
但後來我創建從Component
派生的類,我試圖克隆。
因此,舉例來說,我可能已經調用組件「的PlayerController」:
class PlayerController: Component
所以,如果我想克隆一個PlayerController
I輸入,作爲類型參數; TComponent
應該是PlayerController
類型。我們假設我試圖克隆PlayerController
組件。
如果我調試的源組件,它是在組件GetType().ToString()
名稱:
Debug.WriteLine(source.name);
我得到的輸出「的PlayerController」。
所以這意味着TComponent
是PlayerController
類型,對不對?
但是,如果我調試克隆的名稱,TComponent
的新實例,我會得到輸出「組件」。這意味着由於某種原因,我的新實例TComponent
已轉換爲根類型??
有趣的是,當我重新創建一個控制檯應用程序,我沒有得到這個錯誤...
編輯:
測試來源:
static class Program
{
static void Main(string[] args)
{
PlayerController e = new PlayerController();
PlayerController eClone = Extensions.CloneComponent(e);
Console.WriteLine(e.name);
Console.WriteLine(eClone.name);
}
}
public class Component
{
}
public class PlayerController : Component
{
}
public static class Extensions
{
public static TComponent CloneComponent<TComponent>(this TComponent source) where TComponent : Component, new()
{
var clone = new TComponent();
var srcProperties = System.ComponentModel.TypeDescriptor.GetProperties(typeof(TComponent)).Cast<System.ComponentModel.PropertyDescriptor>();
foreach (var srcProperty in srcProperties)
{
srcProperty.SetValue(clone, srcProperty.GetValue(source));
}
return clone;
}
}
什麼控制檯中的這個輸出是:
PlayerController
Play erController
這意味着TComponent實際上是源的類型。
當我做完完全相同的事情時,我在項目中沒有得到相同的結果?
編輯2:
源參數是從組件列表拍攝,因此顯然作爲參數使用時將它轉換成根型......當我調試它是正確鍵入它給我的前正確的類型。我想我只能提出另一個關於如何繞過這個問題的問題。
您能得到什麼,如果你調試'typeof運算(TComponent)的ToString()'在功能或放在一個變量來檢查像'var x = new TComponent()'? – NetMage
@NetMage看起來像我得到的根類型... –
所以現在你知道'TComponent'的類型。 – NetMage