将创建的对象自动添加到List

时间:2013-06-19 19:15:58

标签: c# visual-studio-2010

我有一个简单的课程

class Employee
    {
        public int EmployeeId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public DateTime HireDate { get; set; }

        public Employee() 
        { 
        }

        public static Employee GetNewestEmployee(List<Employee> e)
        {
            Employee emp = e.OrderByDescending(x => x.HireDate).FirstOrDefault();
            Console.WriteLine("The newest employee was hired on {0}",emp.HireDate);
            return emp;
        }

该方法将返回最近雇用的员工。在我的Main方法中,我有类似

的东西
Employee e = new Employee();
            e.EmployeeId = 101;
            e.FirstName = "Tom";
            e.LastName = "Jones";
            e.HireDate = DateTime.Now.Subtract(TimeSpan.FromDays(40));

            Employee e2 = new Employee();
            e2.EmployeeId = 102;
            e2.HireDate = DateTime.Now.Subtract(TimeSpan.FromDays(100));

            Employee e3 = new Employee();
            e3.EmployeeId = 103;
            e3.HireDate = DateTime.Now.Subtract(TimeSpan.FromDays(1000));
            List<Employee> empList = new List<Employee>();
            empList.Add(e);
            empList.Add(e2);
            empList.Add(e3);

            Console.WriteLine(Employee.GetNewestEmployee(empList).EmployeeId);

        }

所有这些都运行良好,但我想知道如果你不知道将创建多少个Employee对象,或者创建了1000个员工对象,那么解决方案是什么。怎样才能做foreach(object o thatHasBeenInstantiated)之类的事情?

2 个答案:

答案 0 :(得分:1)

您应该考虑创建一个EmployeeFactory对象来为您处理这项工作。

public class EmployeeFactory
{
    private readonly IList<Employee> empList;

    public EmployeeFactory(IList<Employee> empList)
    {
        // guard clause to protect from null lists
        this.empList = empList;
    }

    public Employee Create(/* optional employee data used to instatiate */)
    {
        var newEmp = new Employee();
        this.empList.Add(newEmp);
        return newEmp;
    }
}

然后,您需要创建一名员工,只需使用工厂,当您需要该列表时,您可以提供所需的地方

var empList = new List<Employee>();
var empFactory = new EmployeeFactory(empList);

var emp1 = empFactory.Create();
var emp2 = empFactory.Create();
var emp3 = empFactory.Create();

foreach (var emp in empList)
{
    // do stuff w/ each employee
}

通过创建员工列表并使用EmployeeFactory,您可以为工厂提供只需创建Employee对象的代码,或者只需要员工列表的代码即可。这避免了在代码重用期间可能发生的任何静态引用问题。例如,如果在Employee对象上的静态成员中维护Employee个对象的静态列表,但您不需要担心员工列表,那么该列表将继续增长直到申请被终止。通过单独维护列表,重用代码的应用程序可以选择如何维护员工列表。

答案 1 :(得分:1)

通常,您的员工实体的某些表示形式将存储在数据库中,您可以查询该商店以查找此类方案。

如果你真的想保留所有实例化的Employee对象,你可以维护一个静态列表:

public class Employee
{
    private static readonly IList<Employee> _allEmployees = new List<Employee>();

    public Employee()
    {
        // constructor stuff
        _allEmployees.Add(this);
    }
}

通过这种方式,如果没有将Employee添加到实例集合中,就无法实例化,而static NewestEmployee方法(或属性)会查看_allEmployees列表而不是列出作为参数。