在另一个类中创建Abstract Class的实例

时间:2017-01-05 11:35:57

标签: c# oop abstract-class nullreferenceexception

我试图创建一个抽象类(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;
        }

4 个答案:

答案 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,
              ...
          };
    }
}

应该为您提供有效的解决方案。