我有一个简单的课程
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)
之类的事情?
答案 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
列表而不是列出作为参数。