c# - 创建包含类列表的类列表

标签 c#

我正在研究 C# 类并尝试创建一个程序,该程序具有名为 Employee 的类和 ProductionWorker、ShiftSupervisor 和 TeamLeader 的派生类。

我有一个列表框,我想在其中显示所有员工,在程序中,有添加、编辑或删除相应人员的功能,而不是像这样制作 3 个列表:

List<ProductionWorkers> pWorkers = new List<ProductionWorkers>();
List<ShiftSupervisor> sSupervisors = new List<ShiftSupervisor>();
List<TeamLeader> tLeaders = new List<TeamLeader>();

我希望能够让 Employee 基类拥有或包含它的派生类及其对象的某种列表。

例如,我希望能够以某种方式向员工列表添加和删除派生对象,给出以下示例:

List<Employee> employees = new List<Employee>();
ProductionWorker _pWorker = new ProductionWorker();
_pWorker.Name = "Bob";
_pWorker.EmployeeID = 1234;
employees.Add(_pWorker));

我不知道这样做是否可能或现实,但从我读到的内容来看,似乎有一种方法,我只是不确定如何实现它。但是,如果有人知道更好或更正确的方法来将所有员工列在列表框中,而不必循环遍历不同派生类的 3 个不同列表,我愿意接受更好的建议。

为了清楚起见,下面是基类,然后是它的派生类。

public class Employee
{
    public string Name { get; set; }
    public int EmployeeNumber { get; set; }
}

class ProductionWorker : Employee
{
    public int ShiftNumber { get; set; }
    public decimal HourlyPayRate { get; set; }
}

class TeamLeader : ProductionWorker
{
    public int ReqHours { get; set; }
    public int AttendedHours { get; set; }
}

class ShiftSupervisor : Employee
{
    public int Salary { get; set; }
    public int AnnualProductionBonus { get; set; }
}

直到我在这里发布了我的类(class),我才意识到 Team Leader 实际上是 Production Worker 的派生类。我不确定这是否会改变...

最佳答案

是的,您可以将 Employee 项和从 Employee 派生的项添加到 employee 列表中。

List<Employee> employees = new List<Employee>();
ProductionWorker pWorker = new ProductionWorker {
    Name = "Bob",
    EmployeeID = 1234
};
employees.Add(pWorker);

如果您想在同一个列表框中显示所有这些不同类型的员工,请覆盖这些类中的 ToString 方法。 ListBox 将自动使用它来显示项目。

public class ProductionWorker : Employee
{
    public override string ToString()
    {
        return String.Format("{0} ({1}), production", Name, EmployeeID);
    }
}

您可以像这样将员工列表分配给列表框

employeeListBox.DataSource = employees;

从员工列表中,您可以直接访问 Employee 中声明的成员:

int id = employees[i].EmployeeID;

但是;如果你想访问派生类型的成员,你需要强制转换

int salary = 0;
var supervisor = employees[i] as ShiftSupervisor;
if (supervisor != null) {
   salary = supervisor.Salary;
}

如果你事先知道一个元素的类型你可以直接施放

int salary = ((ShiftSupervisor)employees[0]).Salary;

关于c# - 创建包含类列表的类列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32531656/

相关文章:

c# - Web 服务和 Entity Framework ?

c# - 如何禁用 RadComboBox 的键盘支持?

c# - 使用 Blazor 读取服务器端文件

C# 日期时间运算符 +=

c# - 如何设置属性选择器的值 Expression<Func<T,TResult>>

c# - 绝对 URL 不适用于虚拟目录?

c# - OrderedDictionary 和正则表达式

C# 为 `WhereWithIndex` 编写类型签名

c# - 有关如何链接、编译等以及它们如何组合在一起的书籍?

c# - 获取数量缺货的日期