2016-11-11 6 views
-1

enter image description hereは私がように、それを初期化し、基本クラス内のリストを持ってカウント1でIntitializedと最初の位置にヌル:私はへの呼び出しにブレークポイントを置く場合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"にカーソルを置くと、 "_list"に1のカウントがあることがわかります。ローカルウィンドウを見ると、そのリストの要素[0]が値nullで表示されます。私は_list.Clear()、_list.RemoveAt(0)_list.RemoveAll(述語)を試してみましたが、どれもうまくいきませんでした。呼び出しコードは、リスト内の最初の要素を保持しようとし、オブジェクトがメソッドを呼び出すことを期待しているため、ブレークします。最初の要素が「null」であるため、使い慣れた「オブジェクト参照がオブジェクトのインスタンスに設定されていません」例外が発生します。

ここ

は、クラス全体のファイルの内容である

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、and Verifiable example](http://stackoverflow.com/help/mcve)を含める必要があります。そうしないと、質問がクローズされる可能性があります。 –

答えて

1

答えは簡単です:あなたはコンストラクタを呼び出す右とき ToString()をオーバーライドし、ToString()方法 でプロパティを初期化するには、プロパティを初期化しオブジェクトが作成され、オブジェクトがすぐにその文字列表現を作成するためです。 コードでToCSV(bool includeHeader)ToString()から呼び出すと、_listプロパティの初期化が行われます。 ToString()が呼び出さない他の方法でこのロジックをエクスポートする必要があります。