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

时间:2012-01-24 13:02:24

标签: c# derived-class derived-types

我有一个搜索表单,用于执行返回 Contact 类的子类对象列表的查询。

当在gridviews中使用列表时,不会显示仅存在于子类(例如 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);  
} 

2 个答案:

答案 0 :(得分:2)

是的,仿制药可以在这里提供帮助:

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 method从您的收藏中获取所需类型的所有联系人:

IEnumerable<Employee> employees = contactManager.GetContacts("someSearchValue").OfType<Employee>();

答案 1 :(得分:1)

您可以使用泛型,如下所示:

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