我目前正在尝试克隆我称为“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