在c#的列表中添加一个对象的字段

本文关键字:一个对象 字段 添加 列表 | 更新日期: 2023-09-27 18:18:06

所以我有一个对象列表(AllCompanies),列表中的所有对象都继承自同一个类(Company)。我在类中也有一个字段,它们都继承自另一个类(Employees)。我想创建一个包含当前活动的每个Employee的列表,并且在对象列表中包含每个公司。正如您在下面看到的,我试图简单地将Employee的字段添加到列表中,但是我得到了一个错误,因为我试图将对象转换为员工列表。

public class Main()
{
    List<List<Employee>> AllEmployees = new List<List<Employee>>();
    List<object> AllCompanies = new List<object>() { new SmallCompany(), new LargeCompany(), new SmallCompany() };
    AllCompanies.ForEach(delegate(object o)
    {
        // - Here's the problem.
        AllEmployees.Add(o.GetType().GetField("Employees").GetValue(o));
        // - Here's the problem.
    });
}
class Employee
{
    public string Name;
    public int Age;
    public Employee(string name, int age)
    {
        Name = name;
        Age = age;
    }
}
class Company
{
    public List<Employee> Employees = new List<Employee>();
}
class SmallCompany : Company
{
    public SmallCompany(){}
}
class LargeCompany : Company
{
    public LargeCompany(){}
}

我怎样才能最有效地做到这一点?

在c#的列表中添加一个对象的字段

您不应该将列表键入为object类型列表。对象都是Company对象,列表应该反映这一点。

List<Company> AllCompanies = new List<Company>() 
{
        new SmallCompany(), 
        new LargeCompany(), 
        new SmallCompany() 
};

这将消除对任何可怕的反射代码的需要,这些代码只会使生活变得艰难。

一旦你有了将每个项目投影到一个给定选择器的新项目是很容易做到的:

var allEmployees = AllCompanies.Select(company => company.Employees);

我不知道我是否理解你真正想要的,但如果我这样做了,在我看来,这将是更容易理解和更容易的解决方案:

class Program
{
    static void Main(string[] args)
    {
        List<ICompany> AllCompanies  = new List<ICompany>();
        AllCompanies.Add(new Company());
        AllCompanies.Add(new SmallCompany());
        AllCompanies.Add(new LargeCompany());
        List<Employee> AllEmployees = new List<Employee>();
        foreach(var Company in AllCompanies)
        { 
            Company.Employees.ForEach((Employee)=>
            {
                if(Employee.IsActive)
                    AllEmployees.Add(Employee);
            });
        }
    }
}
class Employee
{
    public string Name;
    public int Age;
    public bool IsActive;
    public Employee(string name, int age)
    {
        Name = name;
        Age = age;
    }
}
interface ICompany
{
    List<Employee> Employees { get; set; }
}
class Company: ICompany
{
    public List<Employee> Employees { get; set; }
}
class SmallCompany : ICompany
{
    public List<Employee> Employees { get; set; }
}
class LargeCompany : ICompany
{
    public List<Employee> Employees { get; set; }
}