J'essaye actuellement de cloner un type personnalisé dans mon projet XNA que j'appelle "Component", en le faisant ressembler à ceci.Créer une nouvelle instance de type générique convertit en type racine?
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;
}
Dans mon projet, il est en fait le code du clonage dans ma méthode, mais comme il n'a rien à ma question de faire je l'ai enlevé.
Pour une explication sur ma classe de composant, j'ai la classe racine appelée Component
mais ensuite je crée des classes qui dérivent de Component
que j'essaye de cloner.
Ainsi, par exemple, je pourrais avoir un composant appelé "PlayerController":
class PlayerController: Component
Donc, si je veux cloner une entrée PlayerController
I que l'argument de type; TComponent
doit être de type PlayerController
.
Supposons que j'essaie de cloner un composant PlayerController
.
Si je déboguer le nom du composant source, qui est GetType().ToString()
dans le composant:
Debug.WriteLine(source.name);
je reçois la sortie « PlayerController ».
Donc, cela signifie que TComponent
est de type PlayerController
, n'est-ce pas?
Cependant, si je débogue le nom du clone, une nouvelle instance de TComponent
, j'obtiens la sortie "Component". Cela signifie que pour une raison quelconque, ma nouvelle instance de TComponent
a été convertie en type racine?
Ce qui est intéressant est que quand je recrée cela dans une application console, je ne comprends pas cette erreur ...
Modifier:
Test à la source:
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;
}
}
Qu'est-ce que cette sorties dans la console est:
PlayerController
Jouer erController
Cela signifie que TComponent est en fait le type de la source. Comment ne pas obtenir les mêmes résultats dans mon projet quand je fais exactement la même chose?
Edit 2:
Le paramètre source est prise à partir d'une liste des composants, et donc apparemment il est converti en type de racine quand il est utilisé comme argument ... Quand je le débugger est bon type avant qu'il me donne la type correct. Je suppose que je vais devoir faire une autre question sur la façon de contourner cela.
Qu'est-ce que vous obtenez si vous déboguez 'typeof (TComponent) .ToString()' dans la fonction ou mettre dans une variable pour vérifier comme 'var x = new TComponent()'? – NetMage
@NetMage On dirait que j'obtiens le type racine ... –
Donc maintenant vous connaissez le type de 'TComponent'. – NetMage