0

我有一个简单的课程

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

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

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)

4

2 回答 2

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
}

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

于 2013-06-19T19:20:40.590 回答
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列表而不是将列表作为参数。

于 2013-06-19T19:22:23.370 回答