Est-il possible d'affecter un objet de classe de base à une référence de classe dérivée avec une conversion de type explicite en C # ?.
Je l'ai essayé et cela crée une erreur d'exécution.
Est-il possible d'affecter un objet de classe de base à une référence de classe dérivée avec une conversion de type explicite en C # ?.
Je l'ai essayé et cela crée une erreur d'exécution.
Non. Une référence à une classe dérivée doit en réalité faire référence à une instance de la classe dérivée (ou null). Sinon, comment vous attendez-vous à ce qu'il se comporte?
Par exemple:
object o = new object();
string s = (string) o;
int i = s.Length; // What can this sensibly do?
Si vous souhaitez pouvoir convertir une instance du type de base en type dérivé, je vous suggère d'écrire une méthode pour créer une instance de type dérivé appropriée. Ou regardez à nouveau votre arbre d'héritage et essayez de le revoir pour que vous n'ayez pas besoin de le faire en premier lieu.
Non, ce n'est pas possible depuis l'affecter à une classe dérivée de référence serait comme dire "la classe de Base est entièrement capable de substitut pour la classe dérivée, il peut faire tout ce que la classe dérivée peut le faire", ce qui n'est pas vrai car les classes dérivées en général, vous offrent plus de fonctionnalités que sa classe de base (au moins, c'est l'idée derrière l'héritage).
Vous pourriez écrire un constructeur dans la classe dérivée de prendre une classe de base de l'objet en tant que paramètre, copiant les valeurs.
Quelque chose comme ceci:
public class Base {
public int Data;
public void DoStuff() {
// Do stuff with data
}
}
public class Derived : Base {
public int OtherData;
public Derived(Base b) {
this.Data = b.Data;
OtherData = 0; // default value
}
public void DoOtherStuff() {
// Do some other stuff
}
}
Dans ce cas, vous devrez copier l'objet de base et d'obtenir un objet de classe dérivée avec des valeurs par défaut pour les dérivés membres. De cette façon, vous pouvez éviter le problème souligné par Jon Skeet:
Base b = new Base();
Dervided d = new Derived();
b.DoStuff(); // OK
d.DoStuff(); // Also OK
b.DoOtherStuff(); // Won't work!
d.DoOtherStuff(); // OK
d = new Derived(b); // Copy construct a Derived with values of b
d.DoOtherStuff(); // Now works!
J'ai eu ce problème et résolu en ajoutant une méthode qui prend un paramètre de type et convertit l'objet actuel dans ce type.
public TA As<TA>() where TA : Base
{
var type = typeof (TA);
var instance = Activator.CreateInstance(type);
PropertyInfo[] properties = type.GetProperties();
foreach (var property in properties)
{
property.SetValue(instance, property.GetValue(this, null), null);
}
return (TA)instance;
}
Cela signifie que vous pouvez l'utiliser dans votre code comme ceci:
var base = new Base();
base.Data = 1;
var derived = base.As<Derived>();
Console.Write(derived.Data); // Would output 1
Comme tout le monde ici l'a dit, ce n'est pas possible directement.
La méthode que je préfère et qui est plutôt propre consiste à utiliser un mappeur d’objets comme AutoMapper .
Il se chargera de copier automatiquement les propriétés d'une instance à une autre (pas nécessairement du même type).
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.