2016-11-11 1 views
-1

enter image description here가 나는 그래서 초기화 기본 클래스의 목록이 카운트 1 Intitialized 첫 번째 위치에 널 (null) : I가 호출에 중단 점을 넣으면C# 목록 <>

protected List<T> _list = null; 
    #region Overrides 

    public override DataTable YieldTable() 
    { 
     DataRow[] cln = new DataRow[_list.Count]; 
     T bob; 
     DataRowCollection item; 
     for (int i = 0; i < _list.Count; i++) 
     { 
      bob = _list[i]; 
      item = bob.YieldTable().Rows; 
      if (item.Count > 0) 
       cln[i] = item[0]; 
     } 
     DataTable tbl = cln.CopyToDataTable(); 
     return tbl; 
    } 

    public override string ToCSV(bool includeHeader = true) 
    { 
     StringBuilder csv = new StringBuilder(); 
     int i; 
     int n; 
     T item; 

     if (_list == null || _list.Count < 1) 
     { 
      _list = new List<T>(1); 
      _list.Add(default(T)); 
     } 
     i = 0; 
     n = _list.Count; 
     //item = _list[0]; 
     //csv.AppendLine(item.ToCSV()); 
     for (i = 0/*1*/; i < n; i++) 
     { 
      item = _list[i]; 
      csv.AppendLine(item.ToCSV(includeHeader)); 
      if (includeHeader) includeHeader = false; 
     } 
     return csv.ToString(); 
    } 

    public override string ToString() 
    { 
     return ToCSV(); 
    } 

    #endregion Overrides 
    protected void DoInitializeCollection() 
    { 
     _list = new List<T>(); 
    } 

"new"를 실행하고 아무런 예외없이 잘 실행되도록하십시오. 새로운 intellisense에 대한 호출이 "_list"에 1이 있다고 알려준 후에 "_list"위로 커서를 놓으면 나타납니다. 지역 창을 볼 때 해당 목록에서 null 값을 가진 요소 [0]을 봅니다. 나는 _list.Clear(), _list.RemoveAt (0) _list.RemoveAll (술어)을 시도했지만 그 중 아무 것도 작동하지 않았다. 호출 코드는 목록의 첫 번째 요소를 유지하려고 시도하고 객체가 메소드를 호출 할 것으로 예상하기 때문에 중단됩니다. 첫 번째 요소가 "null"이기 때문에 익숙한 "개체 참조가 개체의 인스턴스로 설정되지 않았습니다"예외가 발생합니다. , 재정 ToString()와 생성자 호출 할 때 ToString() 방법 의 속성을 초기화하는 것은 재산권을 초기화 :

다음은 전체 클래스 파일의 내용

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Text; 
using System.Linq; 
using System.Collections; 

namespace AIMS.Objects 
{ 
static class Extensions 
{ 
    public static IList<T> Clone<T>(this IList<T> listToClone) where T :  
ICloneable 
    { 
     return listToClone.Select(item => (T)item.Clone()).ToList(); 
    } 
} 

public class BusinessCollectionBase<T> : BusinessObjectBase where T : BusinessObjectBase 
{ 

    #region Variables 

    protected List<T> _list = null; 

    #endregion Variables 

    #region Constructors 

    public BusinessCollectionBase(int capacity) 
    { 
     _list = new List<T>(capacity); 
    } 

    public BusinessCollectionBase() 
    { 
     DoInitializeCollection(); 
    } 

    #endregion Constructors 

    #region Properties 

    public T this[int i] 
    { 
     get 
     { 
      if (_list == null || i < 0 || i >= _list.Count) 
       throw new IndexOutOfRangeException("Attempt to read internal list at location " + i.ToString()); 
      return _list[i]; 
     } 
     set 
     { 
      if (_list == null || i < 0 || i >= _list.Count) 
       throw new IndexOutOfRangeException("Attempt to write internal list at location " + i.ToString()); 
      _list[i] = value; 
     } 
    } 

    public List<T> InternalList 
    { 
     get 
     { 
      return _list; 
     } 
     set 
     { 
      _list = value; 
     } 
    } 

    public int Count 
    { 
     get 
     { 
      if (_list == null) 
       return 0; 
      return _list.Count; 
     } 
    } 

    #endregion Properties 

    #region API 

    public void SortById() 
    { 
     _list.Sort((x, y) => x.Id.CompareTo(y.Id)); 
    } 

    #region Static 

    protected static DataRowCollection Get(string sp, Dictionary<string, string> parms) 
    { 
     DataTable cln = BusinessObjectBase.GetDataTable(sp, parms); 

     return cln.Rows; 
    } 

    protected static DataSet Set(string sp) 
    { 
     DataSet ds = BusinessObjectBase.GetSet(sp); 

     return ds; 
    } 

    #endregion Static 

    #endregion API 

    #region Overrides 

    public override DataTable YieldTable() 
    { 
     DataRow[] cln = new DataRow[_list.Count]; 
     T bob; 
     DataRowCollection item; 
     for (int i = 0; i < _list.Count; i++) 
     { 
      bob = _list[i]; 
      item = bob.YieldTable().Rows; 
      if (item.Count > 0) 
       cln[i] = item[0]; 
     } 
     DataTable tbl = cln.CopyToDataTable(); 
     return tbl; 
    } 

    public override string ToCSV(bool includeHeader = true) 
    { 
     StringBuilder csv = new StringBuilder(); 
     int i; 
     int n; 
     T item; 

     if (_list == null || _list.Count < 1) 
     { 
      _list = new List<T>(1); 
      _list.Add(default(T)); 
     } 
     i = 0; 
     n = _list.Count; 
     //item = _list[0]; 
     //csv.AppendLine(item.ToCSV()); 
     for (i = 0/*1*/; i < n; i++) 
     { 
      item = _list[i]; 
      csv.AppendLine(item.ToCSV(includeHeader)); 
      if (includeHeader) includeHeader = false; 
     } 
     return csv.ToString(); 
    } 

    public override string ToString() 
    { 
     return ToCSV(); 
    } 

    #endregion Overrides 

    #region Virtual 

    protected void DoInitializeCollection() 
    { 
     _list = new List<T>(0); 
    } 

    public virtual void Add(T item) 
    { 
     _list.Add(item); 
    } 

    public virtual void AddRange(BusinessCollectionBase<T> bob) 
    { 
     foreach (T b in bob.InternalList) 
     { 
      this.InternalList.Add(b); 
     } 
    } 

    public virtual List<T> GetDistinct(string byField, bool sortItToo = false) 
    { 
     if (_list == null) 
      return new List<T>(); 
     ArrayList uniqueVins = new ArrayList(); 
     List<T> newList = new List<T>(); 
     foreach (T t in _list) 
     { 
      if (t._properties[byField] != null && !uniqueVins.Contains(t._properties[byField])) 
      { 
       if (!string.IsNullOrEmpty(t._properties[byField].ToString())) 
       { 
        uniqueVins.Add(t._properties[byField].ToString()); 
        newList.Add(t); 
       } 
      } 
     } 
     if (sortItToo) 
     { 
      // This shows calling the Sort(Comparison(T) overload using 
      // an anonymous method for the Comparison delegate. 
      // This method treats null as the lesser of two values. 
      newList.Sort(delegate(T x, T y) 
      { 
       if (x._properties[byField] == null && x._properties[byField] == null) return 0; 
       else if (x._properties[byField].ToString() == null) return -1; 
       else if (y._properties[byField].ToString() == null) return 1; 
       else return x._properties[byField].ToString().CompareTo(y._properties[byField].ToString()); 
      }); 
     } 
     return newList; 
    } 

    #endregion Virtual 

    #region Helper Methods 

    protected List<T> FilterOut(Predicate<T> p) 
    { 
     if (this.Count < 1) 
      return null; 
     List<T> filtered = _list; 
     filtered.RemoveAll(p); 

     return filtered; 
    } 

    #endregion Helper Methods 
} 

}

+0

현지인 창의 스크린 샷을 찍어 질문에 추가하십시오. 또한 제공 한 코드로 문제를 다시 만들 수 없습니다. –

+1

기본 클래스와 파생 클래스를 표시하십시오. 뭔가 다른 방식으로 초기화하고 있습니다. –

+1

귀하의 문제는 재현 불가능합니다. 질문에 [Minimal, Complete, Verifiable example] (http://stackoverflow.com/help/mcve)을 포함해야합니다. 그렇지 않으면 질문이 닫힐 수 있습니다. –

답변

1

대답은 간단하다 왜냐하면 객체가 생성되고 객체가 문자열 표현을 즉시 생성하기 때문입니다. 코드에서 ToCSV(bool includeHeader)ToString()에서 호출하고 여기에서 _list 속성의 초기화가 발생합니다. ToString()이 호출하지 않는 다른 방법으로이 논리를 내 보내야합니다.