2015-05-21 2 views
0

У меня есть класс, который я инициализирую из другого класса внутри этого класса там свойство a с классом [] как тип, как инициализировать и заполнить этот массив значением { 1, «something»}, я не могу добраться до него, спасибо. В самом низу, что я пытался до сих пор кодируетсяНевозможно инициализировать массив или заполнить массив данными

/// Calss А

public partial class classA_1: object,System.ComponentModel.INotifyPropertyChanged { 

private classB_1[] numberOfUnitField; 


/// <remarks/> 
[System.Xml.Serialization.XmlArrayAttribute(Order=0)] 
[System.Xml.Serialization.XmlArrayItemAttribute("unitNumberDetail", IsNullable=false)] 
public classB_1[] numberOfUnit { 
      get { 
       return this.numberOfUnitField; 
      } 
      set { 
       this.numberOfUnitField = value; 
       this.RaisePropertyChanged("numberOfUnit"); 
      } 
     } 
} 

/// Класс B

public partial class classB_1 : object, System.ComponentModel.INotifyPropertyChanged { 

     private string numberOfUnitsField; 

     private string typeOfUnitField; 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElementAttribute(DataType="integer", Order=0)] 
     public string numberOfUnits { 
      get { 
       return this.numberOfUnitsField; 
      } 
      set { 
       this.numberOfUnitsField = value; 
       this.RaisePropertyChanged("numberOfUnits"); 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlElementAttribute(Order=1)] 
     public string typeOfUnit { 
      get { 
       return this.typeOfUnitField; 
      } 
      set { 
       this.typeOfUnitField = value; 
       this.RaisePropertyChanged("typeOfUnit"); 
      } 
     } 

     public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; 

     protected void RaisePropertyChanged(string propertyName) { 
      System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged; 
      if ((propertyChanged != null)) { 
       propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); 
      } 
     } 
    } 

Кодовый до сих пор:

class Program 
    { 
     static void Main(string[] args) 
     { 
ClassA_1 a = new ClassA_1(); 


      Hashtable hash = new Hashtable(); 
      hash.Add("1", "PX"); 
      hash.Add("200", "RC"); 
      int i = 0;  

      int d = hash.Keys.Count; 

      b.numberOfUnit = new classB_1 [d]; 


      foreach (DictionaryEntry entry in hash) 
      { 
       //throws an error object not instantiated on the following code    
       b.numberOfUnit[i].numberOfUnits = entry.Key.ToString(); 
       b.numberOfUnit[i].typeOfUnit = entry.Value.ToString(); 
       i++; 
      } 
} 
} 

Окончательный рабочий код:

Dictionary<int, string> hash = new Dictionary<int, string>(); 
hash.Add(1, "PX"); 
    hash.Add(200, "RC"); 

b.numberOfUnit = hash.Select(h => new ClassB_1 
                { 
                 numberOfUnits = h.Key.ToString(), 
                 typeOfUnit = h.Value.ToString() 
                }) 
                  .ToArray(); 
+0

'i' не ссылается в' Еогеасп 'кроме приращения, и у вас есть индексы' 0' и '1', жестко закодированные. Не думайте, что это то, что вы хотите. – crashmstr

+0

изменен 0 и 1 на i – Developer

+0

Почему массив инициализирован вне класса, в котором он живет? – RadioSpace

ответ

2

Вы создаете массив, но так как массив представляет собой массив ссылочных типов, каждая ссылка должна быть инициализирована, а также. Кроме того, вы не используете i в петле - Я думаю, что вы хотите:

b.numberOfUnit = new classB_1 [d]; 

foreach (DictionaryEntry entry in hash) 
{ 
    //throws an error object not instantiated on the following code    

    b.numberOfUnit[i] = new classB_1(); 
    b.numberOfUnit[i].numberOfUnits = entry.Key.ToString(); 
    b.numberOfUnit[i].typeOfUnit = entry.Value.ToString(); 
    i++; 
} 

Обратите внимание, что вы можете также использовать Linq для создания массива:

b.numberOfUnit = hash.Select(h => new classB_1 { 
               numberOfUnits = h.Key.ToString(), 
               typeOfUnit = h.Value.ToString() 
               }) 
        .ToArray(); 
+0

Спасибо, изменилось с типа хранилища с хеш-таблицы на словарь и оба кода работают. – Developer

0

Если вы пытаетесь инициализировать массив ссылочных типов, вы не можете использовать Array.Initialize, но вы можете использовать Linq.

private MyClass[] _myArray = Enumerable.Range(1, 10).Select(i => new MyClass()).ToArray(); 
Смежные вопросы