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

发布于 2024-12-29 04:46:13 字数 749 浏览 1 评论 0原文

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

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

有没有办法让子类中的 GetContacts 返回 Employee 列表而不是 Contact 列表?或者将 Contact 列表“转换”为 Employee 列表的方法?

提前致谢 !

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);  
} 

I have a search form that executes queries returning lists of objects that are sub-classes of a Contact class.

When the lists are used in gridviews, properties that only exist in sub-classes (such as HireDate) are not displayed because the list contains objects of the base class (Contact).

Is there a way to make GetContacts in the sub-class return a list of Employee instead of a list of Contact ? Or a way to "cast" the list of Contact into a list of Employee ?

Thanks in advance !

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);  
} 

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

丢了幸福的猪 2025-01-05 04:46:13

是的,泛型可以在这里提供帮助:

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>();

Yes, generics can help here:

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);  
}

Alternatively, you can use the LINQ OfType method to get all contacts of a desired type from your collection:

IEnumerable<Employee> employees = contactManager.GetContacts("someSearchValue").OfType<Employee>();
只有一腔孤勇 2025-01-05 04:46:13

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

public abstract class ContactManager<TContactType> 
    where TContactType : Contact 
{
    public abstract List<TContactType> GetContacts(string searchValue);  
}

public abstract class EmployeeManager : ContactManager<Employee> 
{
    ...
}

这允许您限制 ContactManager 与特定的特定基本类型(即 Contact)一起使用,并进一步使用特定类型(< code>Contact)以使用强类型进行深入分析,例如使用 Employee

You could use generics, something like this:

public abstract class ContactManager<TContactType> 
    where TContactType : Contact 
{
    public abstract List<TContactType> GetContacts(string searchValue);  
}

public abstract class EmployeeManager : ContactManager<Employee> 
{
    ...
}

This allows you to constrain ContactManager to work with specific a specific base type (i.e Contact) and further use the specific type (of Contact) to drill down with strong typing, for instance, with Employee.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文