Возвращает производный тип в производной функции
-
13-11-2019 - |
Вопрос
У меня есть форма поиска, которая выполняет запросы, возвращающие списки объектов, которые являются подклассами a Контакт класс.
Когда списки используются в gridviews, свойства, которые существуют только в подклассах (таких как Нанятый) не отображаются, поскольку список содержит объекты базового класса (Контакт).
Есть ли способ сделать Получать контакты в подклассе возвращает список Работник вместо списка Контакт ?Или способ "разыграть" список Контакт в список Работник ?
Заранее спасибо!
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);
}
Решение
Да, дженерики могут помочь здесь:
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);
}
.
В качестве альтернативы вы можете использовать Метод Linq oftype , чтобы получить всеКонтакты желаемого типа из вашей коллекции:
IEnumerable<Employee> employees = contactManager.GetContacts("someSearchValue").OfType<Employee>();
. Другие советы
Вы могли бы использовать дженерики, что-то вроде этого:
public abstract class ContactManager<TContactType>
where TContactType : Contact
{
public abstract List<TContactType> GetContacts(string searchValue);
}
public abstract class EmployeeManager : ContactManager<Employee>
{
...
}
Это позволяет вам ограничивать ContactManager
для работы с конкретным базовым типом (т.е Contact
) и в дальнейшем использовать конкретный тип (из Contact
) для детализации с помощью строгой типизации, например, с помощью Employee
.