Retourner le type dérivé dans la fonction dérivée
-
13-11-2019 - |
Question
J'ai un formulaire de recherche qui exécute des requêtes renvoyant des listes d'objets qui sont des sous-classes d'un Contact classer.
Lorsque les listes sont utilisées dans GridViews, les propriétés qui n'existent que dans les sous-classes (comme Date d'embauche) ne sont pas affichés car la liste contient des objets de la classe de base (Contact).
Y a-t-il un moyen de faire GetContacts Dans la sous-classe, renvoie une liste de Employé au lieu d'une liste de Contact ? Ou un moyen de "lancer" la liste de Contact dans une liste de Employé ?
Merci d'avance !
public abstract class Contact
{
public string Name { get; set; }
}
public class Employee : Contact
{
public DateTime HireDate { get; set; }
}
public abstract class ContactManager
{
public abstract List<Contact> GetContacts(string searchValue);
}
public class EmployeeManager : ContactManager
{
public abstract List<Contact> GetContacts(string searchValue);
}
La solution
Oui, les génériques peuvent aider ici:
public abstract class ContactManager<T> where T : Contact
{
public abstract List<T> GetContacts(string searchValue);
}
public class EmployeeManager : ContactManager<Employee>
{
public abstract List<Employee> GetContacts(string searchValue);
}
Alternativement, vous pouvez utiliser le Méthode Linq de Type Pour obtenir tous les contacts d'un type souhaité de votre collection:
IEnumerable<Employee> employees = contactManager.GetContacts("someSearchValue").OfType<Employee>();
Autres conseils
Vous pouvez utiliser des génériques, quelque chose comme ceci:
public abstract class ContactManager<TContactType>
where TContactType : Contact
{
public abstract List<TContactType> GetContacts(string searchValue);
}
public abstract class EmployeeManager : ContactManager<Employee>
{
...
}
Cela vous permet de contraindre ContactManager
pour travailler avec un type de base spécifique (c.-à-d. Contact
) et utiliser davantage le type spécifique (de Contact
) pour explorer avec un dactylographie forte, par exemple, avec Employee
.