2014-01-23 3 views
0

Я пытаюсь сделать цикл через словарь (код в button_click - тот, который я пытаюсь исправить), чтобы получить все свойства моего класса. Вместо того, чтобы писать их один за другим, как сейчас выглядит мой код. Текущая версия работает нормально, но если a должно иметь как 50 свойств или более, я думаю, что должен быть более простой способ сделать это с помощью какого-то цикла.Как пройти через словарь, чтобы получить все свойства класса?

class Person 
     { 
      public int PersNr { get; set; } 
      public string Name { get; set; } 
      public string BioPappa { get; set; } 
      public Adress Adress { get; set; } 


      public static Dictionary<int, Person> Metod() 
      { 
       var dict = new Dictionary<int, Person>(); 

       dict.Add(8706, new Person 
       { 
        Name = "Person", 
        PersNr = 8706, 
        BioPappa = "Dad", 
        Adress = new Adress 
        { 
         Land = "Land", 
         PostNr = 35343, 
         Stad = "city" 
        } 
       }); 

       dict.Add(840, new Person 
       { 
        Name = "Person", 
        PersNr = 840, 
        BioPappa = "Erik" 
       }); 
       return dict; 

      } 

     } 

public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      Dictionary<int, Person> myDic = Person.Metod(); 
      var person = myDic[int.Parse(textBoxSok.Text)]; 

      listBox1.Items.Add(person.Name); 
      listBox1.Items.Add(person.PersNr); 
      listBox1.Items.Add(person.BioPappa); 
      listBox1.Items.Add(person.Adress.Stad); 
      listBox1.Items.Add(person.Adress.PostNr); 
      listBox1.Items.Add(person.Adress.Land);   
     } 
    } 
+0

Наполнение свой словарь из файла с петлей будет проще. Вам все еще нужны все данные, определенные где-то. –

+0

Мне ваш вопрос непонятен – akonsu

+0

держите этот путь, это проще. И если у вас есть 50 свойств в одном классе, исправьте свой дизайн. –

ответ

0

Что-то, чтобы вы начали (с использованием System.Reflection):

private void getProperties(Object obj, ListBox listBox1) 
{ 
    PropertyInfo[] pi = obj.GetType().GetProperties(); 
    foreach (PropertyInfo p in pi) 
    { 
     if (p.PropertyType.IsGenericType) 
     { 
      object o = p.GetValue(obj, null); 
      if (o != null) 
      { 
       if (o is Address) 
        getProperties(o, listBox1); 
       else 
        listBox1.Items.Add(o.ToString()); 
      } 
     } 
    } 
} 
+0

Создает ли этот код массив, в котором он хранит типы/свойства из класса Person? Когда я перехожу через цикл, все возвращается - null. Кроме того, я должен использовать «using System.Reflection»? Если нет, я получаю ошибки. – user3228992

+0

Если я изменил «if (p.PropertyType.IsGenericType)» на «if (p.PropertyType.IsVisible)». Я получил его работу с базовым классом, ведьма - «Человек». :) Но он по-прежнему не показывает свойства для моего класса Adress. Ты знаешь почему? – user3228992

+0

Изменен для включения адреса. – klugerama

Смежные вопросы