我试图创建一个抽象类(Employee)的实例
public abstract class Employee
{
public Employee() { }
public static SchoolEmployeesContext ctx = new SchoolEmployeesContext();
public int EmployeeId { get; set; }
public string EmployeeName { get; set; }
public string EmployeeSurname { get; set; }
public string Address { get; set; }
public int Grade { get; set; }
public double Salary { get; set; }
public DateTime DateOfCommencement { get; set; }
public string Username { get; set; }
public string Password { get; set; }
public Department DepartmentOfEmployee { get; set; }
}
现在我尝试从上下文中获取一个Employee,用于多种功能,例如编辑和删除员工。在Method中声明Employee为null允许删除“Unassigned”错误。但是在运行时显然给了我一个“null引用异常”
查找以下员工的方法:
public Employee Search(int EmpId)
{
var Emp = from emp in ctx.Employees
where emp.EmployeeId == EmpId
select emp;
Employee Found = null;
foreach (Employee e in Emp)
{
Found.EmployeeName = e.EmployeeName;
Found.EmployeeSurname = e.EmployeeSurname;
Found.Address = e.Address;
Found.Grade = e.Grade;
Found.Salary = e.Salary;
Found.DateOfCommencement = e.DateOfCommencement;
Found.Username = e.Username;
Found.Password = e.Password;
Found.DepartmentOfEmployee = e.DepartmentOfEmployee;
}
return Found;
}
答案 0 :(得分:2)
抽象类无法实例化 它们可以从中继承,并且可以实例化继承的类型,但不能直接实例化。
查看您的代码,这是(我认为)您想要做的事情:
从班级定义中删除abstract
此外,您的Employee
课程中还有一个完全未使用的静态 -
public static SchoolEmployeesContext ctx = new SchoolEmployeesContext();
所以我建议删除它。
您的Employee
课程将成为:
public class Employee
{
public Employee() { }
public int EmployeeId { get; set; }
public string EmployeeName { get; set; }
public string EmployeeSurname { get; set; }
public string Address { get; set; }
public int Grade { get; set; }
public double Salary { get; set; }
public DateTime DateOfCommencement { get; set; }
public string Username { get; set; }
public string Password { get; set; }
public Department DepartmentOfEmployee { get; set; }
}
此外,您的Search
方法看起来有点可疑。
您正在从数据库中选择多个员工,其中EmployeeId
等于提供的EmpId
看起来不对我。
您可以使用LINQ SingleOrDefault
按ID检索单个项目(如果不存在,则返回null)
因此,您的Search
方法现在看起来像
public Employee Search(int EmpId)
{
//this will return the single employee
var Emp = ctx.Employees.SingleOrDefault(x=> x.EmployeeId == EmpId);
return Emp;
}
答案 1 :(得分:0)
您无法实例化抽象类。您可以在此处找到有关它们的更多信息:https://msdn.microsoft.com/en-us/library/k535acbf(v=vs.71).aspx
抽象类与接口密切相关。它们是无法实例化的类,并且通常是部分实现的,或者根本没有实现。
答案 2 :(得分:0)
否则您无法创建抽象类的实例,因为它没有完整的实现。抽象类的目的是充当子类的基础。它就像一个模板,或一个空的或部分空的结构,你应该扩展它并在它之前构建它
答案 3 :(得分:0)
无法实例化抽象类。在您提供的代码中,Employee不需要是抽象的,因此您应该从Employee类定义中删除abstract修饰符。
正如其他人所指出的,您的搜索方法似乎是错误的,应该更改以选择与员工ID匹配的员工实体,如果找到,则将该实体映射到员工。像这样:
public Employee Search(int EmpId)
{
// Return the employee with the correct Id (or null if not found).
var e = ctx.Employees.SingleOrDefault(x=> x.EmployeeId == EmpId);
return employeeEntity == null
? null
: new Employee
{
EmployeeName = e.EmployeeName,
EmployeeSurname = e.EmployeeSurname,
...
};
}
}
应该为您提供有效的解决方案。