c# - cast classe générique à sa base non-classe générique
J'ai des classes suivantes:
public abstract class CustomerBase
{
public long CustomerNumber { get; set; }
public string Name { get; set; }
}
public abstract class CustomerWithChildern<T> : CustomerBase
where T: CustomerBase
{
public IList<T> Childern { get; private set; }
public CustomerWithChildern()
{
Childern = new List<T>();
}
}
public class SalesOffice : CustomerWithChildern<NationalNegotiation>
{
}
La SalesOffice est juste l'une des rares classes qui représentent les différents niveaux de la hiérarchie client. Maintenant, j'ai besoin de marcher à travers cette hiérarchie à partir d'un certain moment (CustomerBase). Je peux pas comprendre comment le mettre en œuvre sans l'aide de la réflexion. J'aimerais mettre en place quelque chose comme:
public void WalkHierarchy(CustomerBase start)
{
Print(start.CustomerNumber);
if (start is CustomerWithChildern<>)
{
foreach(ch in start.Childern)
{
WalkHierarchy(ch);
}
}
}
Est-il une chance que je pourrais obtenir quelque chose de ce genre de travail?
La solution basée sur les a-sont envoyés interface que j'ai mis en œuvre:
public interface ICustomerWithChildern
{
IEnumerable ChildernEnum { get; }
}
public abstract class CustomerWithChildern<T> : CustomerBase, ICustomerWithChildern
where T: CustomerBase
{
public IEnumerable ChildernEnum { get { return Childern; } }
public IList<T> Childern { get; private set; }
public CustomerWithChildern()
{
Childern = new List<T>();
}
}
public void WalkHierarchy(CustomerBase start)
{
var x = start.CustomerNumber;
var c = start as ICustomerWithChildern;
if (c != null)
{
foreach(var ch in c.ChildernEnum)
{
WalkHierarchy((CustomerBase)ch);
}
}
}
OriginalL'auteur Buthrakaur | 2009-04-02
Vous devez vous connecter pour publier un commentaire.
Je crois que vous voulez faire de la recherche pour la détermination de faire de la marche une interface.
Alors peut-être ajouter un "IWalkable" de l'interface qui contient les informations nécessaires pour faire de la marche, alors vous pouvez créer votre méthode de vérification pour voir si l'objet passé implémente l'interface.
OriginalL'auteur Mitchel Sellers
Vous pouvez déplacer la WalkHierarchy méthode de la classe de base et de le rendre virtuel. La classe de base de la mise en œuvre serait de ne traiter que le nœud courant. Pour le
CustomerWithChildern<T>
classe, remplacer le ferait un véritable pied.Haut louange de la part de quelqu'un du nom, "récursif". 😉
Mon dernier gros .Un projet de réseau a une exigence semblable, et John Saunders' manière est beaucoup comme je l'ai fait. Fait beaucoup de choses beaucoup plus facile 🙂
OriginalL'auteur John Saunders
Essayez ceci:
OriginalL'auteur Sunny Milenov
"Est" et "en tant Que" seul le travail sur pleinement qualifié types génériques.
Voir cette discussion MSDN pour plus de détails, y compris les solutions de contournement.
Les plus courantes solution de contournement que j'ai vu est d'ajouter une interface pour le mélange que votre CustomerWithChildren pourrait mettre en œuvre, et de vérifier que l'interface.
OriginalL'auteur Reed Copsey
Je pense que tout le monde tape ce "problème" lors de la première réunion de travail avec les classes génériques.
Votre premier problème, il est fait allusion dans votre question phrasé: ouvert de type générique n'est PAS la classe de base pour une fermée. Il n'y a pas OO relation ici, à tous. Le réel de la classe de base est CustomerBase. Un "open" de type générique, c'est comme un demi-complété en classe; spécification des arguments de type "ferme", en le rendant complète.
Alors que vous pouvez faire:
la condition
sera toujours Faux.
-Oisin
OriginalL'auteur x0n
Explicitement avec cette méthode, aucun. Cependant, vous pouvez obtenir la même fonctionnalité avec une interface. En fait, vous pourriez juste avoir votre classe générique de mettre en œuvre IEnumerable. Il est également intéressant de noter que votre classe doit également disposer "où T : CustomerBase" afin d'assurer la sécurité de type.
OriginalL'auteur Adam Robinson