Возвращает производный тип в производной функции

StackOverflow https://stackoverflow.com/questions/8987259

  •  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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top