我有一个搜索表单,用于执行返回 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);
}
答案 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
。