2017-02-08 16 views
0

メンバー変数にリストを割り当てたいのですが(変数はリスト)、エラーメッセージが表示されます。System.StackOverflowExceptionは処理されませんでした。以下の私のコード:メンバー変数に値を代入できませんでした。StackOverflowExceptionが発生しました。

public class Employee 
{ 
    public int EmployeeID { get; set; } 
    public string EmployeeName { get; set; } 
    public int DeptID { get; set; } 
} 

public class Department 
{ 
    public int DeptID { get; set; } 
    public string DeptName { get; set; } 
    public List<Employee> Employees 
    { 
     set { Employees = value; } 
     //get { return EmployeeDataAccessLayer.getEmployeesByDeptID(DeptID); } 
     get { return Employees; } 
    } 
} 
public class EmployeeDataAccessLayer 
{ 
    public static List<Employee> getEmployeesByDeptID(int deptID) 
    { 
     string conStr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; 
     string sqlStr = "select * from tblemployee where deptid = :deptid order by employeeid asc"; 
     List<Employee> employees = new List<Employee>(); 
     using (OracleConnection ocon = new OracleConnection(conStr)) 
     { 
      OracleCommand ocmd = new OracleCommand(sqlStr, ocon); 
      ocmd.Parameters.Add(":deptid", deptID); 
      ocmd.Connection.Open(); 
      OracleDataReader rdr = ocmd.ExecuteReader(); 
      while (rdr.Read()) 
      { 
       Employee employee = new Employee(); 
       employee.EmployeeID = Convert.ToInt32(rdr["EMPLOYEEID"]); 
       employee.EmployeeName = rdr["NAME"].ToString(); 
       employee.DeptID = Convert.ToInt32(rdr["DEPTID"]); 
       employees.Add(employee); 
      } 
     } 
     return employees; 
    } 
} 

public class DepartmentDataAccessLayer 
{ 

    public static List<Department> getAllDepartments() 
    { 
     string conStr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; 
     string sqlStr = "select * from tbldepartment order by departmentid asc"; 
     List<Department> depts = new List<Department>(); 

     using (OracleConnection ocon = new OracleConnection(conStr)) 
     { 
      OracleCommand ocmd = new OracleCommand(sqlStr, ocon); 
      ocmd.Connection.Open(); 
      OracleDataReader rdr = ocmd.ExecuteReader(); 
      while (rdr.Read()) 
      { 
       Department dept = new Department(); 
       dept.DeptID = Convert.ToInt32(rdr["DEPARTMENTID"]); 
       dept.DeptName = rdr["NAME"].ToString(); 
       dept.Employees = EmployeeDataAccessLayer.getEmployeesByDeptID(dept.DeptID); 
       depts.Add(dept); 
      } 
     } 

     return depts; 
    } 
} 

ので、私はそれをデバッグすると、例外が発生した時に見つけ:

set { Employees = value;}  

スクリーンショット以下を参照してください。

enter image description here

私は本当に理由を知らないのですが、理由を教えてもらえますか、私にいくつかの提案をしてもらえますか?

答えて

1

private List<Employee> _Employees 
public List<Employee> Employees 
{ 
    set { _Employees = value; }  
    get { return _Employees; } 
} 

またはこのような:これは、このようなプロパティ定義を変更して克服するためにスタックがオーバーフローするまで設定してください。

あなたが従業員を保持するためにプライベート変数を使用していないので、あなたは自分の他のプロパティと同様に、それ自体に値を設定するために、自動ゲッターと-setterを使用することができます。

public List<Employee> Employees { get; set; } 

そうでない場合は、セットアップ従業員のリストを保持するプライベート変数。これは使用できます

private List<Employee> _employees; 
public List<Employee> Employees 
{ 
    set { _employees = value; } 
    get { return _employees; } 
} 
1

あなたが得るとセットでC#で値を設定している場合は、あなたがする必要がありますすべては空getおよびsetブロックで

public List<Employee> Employees{get; set;} 

で、値が自動的に割り当てられます。あなたのコードでは、StackOverflowの例外は、あなたの場合はプロパティhere

2

詳しい情報を発生するまであなたは、本質的に何度も何度もあなたの変数にセット関数を呼び出している、あなたはEmployeesに何かを割り当てるときには、セッターです再び同じ変数に割り当てられます。同じプロセスが続行され、無限の割り当てが行われるため、その例外を取得しています。あなたがあるvalueEmployeesを設定しているvalueEmployeesを設定しているvalueEmployeesを設定しているので

public List<Employee> Employees { get; set; } 
関連する問題