在派生函数中返回派生类型

本文关键字:派生 类型 返回 函数 | 更新日期: 2023-09-27 18:21:11

我有一个搜索表单,它执行返回对象列表的查询,这些对象是Contact类的子类。

在网格视图中使用列表时,仅存在于子类(如HireDate)中的属性不会显示,因为列表包含基类的对象(Contact

有没有办法让子类中的GetContacts返回Employee的列表,而不是Contact的列表?或者将联系人列表"转换"为员工的列表?

提前感谢!

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