Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
artemav
0 / 0 / 0
Регистрация: 12.02.2013
Сообщений: 18
1

Обращения к полям класса по порядку

13.04.2013, 01:31. Просмотров 1429. Ответов 24
Метки нет (Все метки)

Имеется класс, как обращаться к каждому полю этого класса по порядку для записи.
Считываю строки значения для полей ,разделены запятыми, хочу сделать чтобы каждому полю как только он находит запятую присваиваволось значение до запятой

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
class TargetHuman
    {
        int Num;
        string GivName;
        char MidInit;
        string Surname;
        bool Gender;
        string City;
        string State;
        string Email;
        string TelNum;
        string DateOfB;
        string Occup;
        string Company;
        double Weight;
        int Height;
        string StAdress;
        int Zip;
        string Country;
 
    }
    class Program
    {
        
        
        static void Main(string[] args)
        {
            StreamReader sr = new StreamReader("C:/data.txt");
            string Line;
            int k = 0;
            TargetHuman[] arr = new TargetHuman[10000];
            while((Line = sr.ReadLine())!= null)
            {
                k++;
                for (int i = 0; i < Line.Length; i++)
                {
                    if (Line[i] == ',')
                    {
                            
                    }
                }
            }
        }
Добавлено через 49 минут
Ответа судя по всему ждать не стоит, решил костылем, большоооой свитч впили, по переменной.

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.04.2013, 01:31
Ответы с готовыми решениями:

Правила обращения к методам, полям.
Помогите расставить точки над &quot;ё&quot;: В одном пространстве имен есть два класса...

Заполнение поля класса - после обращения к нему
Предположим у меня есть класс: public class Data { // -- public string...

Проход по полям класса
Здравствуйте. Есть класс static class Data { public static...

Обращение к полям базового класса
abstract class BaseClass { int _pole = 0; public virtual...

Создание аксессоров к полям класса
Здраствуйте. надо создать класс, в котором имеется несколько полей типа...

24
Монфрид
1211 / 1021 / 293
Регистрация: 07.03.2012
Сообщений: 3,243
Завершенные тесты: 2
13.04.2013, 09:11 2
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
while((Line = sr.ReadLine())!= null)
            {
                k++;
               string []splitedValues=Line.Split(new char[]{','});
TargetHuman human = new TargetHuman();
PropertyInfo []properties=human.GetType().GetProperties();
for (int i=0;i<splitedValued.Count();i++)
{
properties[i].SetValue(human, Convert.ChangeType(splitedValues[i],properties[i].PropertyType));
 
}
//потом добавляете human в массив
            }
1
artemav
0 / 0 / 0
Регистрация: 12.02.2013
Сообщений: 18
14.04.2013, 18:30  [ТС] 3
Монфрид, а можно подробнее узнать что делает, PropertyInfo, на msdn увы я не понимаю...

Добавлено через 16 минут
Ни одна из перегрузок метода "SetValue" не принимает "2" аргументов
вылетает на строке с SetValue,посмотрел на msdn там
C#
1
2
3
4
 public void SetValue(
    Object obj,
    Object value
)
что может быть не верно.
0
Монфрид
1211 / 1021 / 293
Регистрация: 07.03.2012
Сообщений: 3,243
Завершенные тесты: 2
14.04.2013, 18:33 4
ProperyInfo позволяет извлекать свойства из объекта, не зная имён этих свойств. Так же позволяет устанавливать значения в свойства не зная названия свойства
1
Tsin
722 / 467 / 183
Регистрация: 30.12.2012
Сообщений: 1,265
Записей в блоге: 2
Завершенные тесты: 3
14.04.2013, 18:34 5
artemav, попробуй SetValue(Object obj, Object value, Object[] index) и на место последнего параметра ставить null
0
artemav
0 / 0 / 0
Регистрация: 12.02.2013
Сообщений: 18
14.04.2013, 18:42  [ТС] 6
Цитата Сообщение от Tsin Посмотреть сообщение
artemav, попробуй на место последнего параметра ставить null
properties[i].SetValue(human, Convert.ChangeType(splitedValues[i],properties[i].PropertyType,null));

Помогло это обойти, но индекс вылез за границы, щас сам подумаю.

Добавлено через 5 минут
http://msdn.microsoft.com/ru-ru/library/xb5dd1f1.aspx

Насколько я понимаю у меня свойства все таки индексированные, значит там должно быть не null , но и i не может быть так как это int , а не object[]
0
Tsin
722 / 467 / 183
Регистрация: 30.12.2012
Сообщений: 1,265
Записей в блоге: 2
Завершенные тесты: 3
14.04.2013, 18:44 7
artemav, вот так : (используя код Монфрид-а)
C#
1
2
3
4
5
6
PropertyInfo[] properties = human.GetType().GetProperties();
for (int i=0;i<splitedValued.Count();i++)
{
    TypeConverter converter = TypeDescriptor.GetConverter(properties[i].PropertyType);
    properties[i].SetValue(human, converter.ConvertFromString(splitedValues[i]), null);
}
Возможно с ошибками, писал по памяти..но посмотри)
0
artemav
0 / 0 / 0
Регистрация: 12.02.2013
Сообщений: 18
14.04.2013, 18:49  [ТС] 8
Не помогает, теперь на строку с типконвертер ссылается что вышел за границы
0
Tsin
722 / 467 / 183
Регистрация: 30.12.2012
Сообщений: 1,265
Записей в блоге: 2
Завершенные тесты: 3
14.04.2013, 18:52 9
artemav, ну, в любом случае, это уже не проблема обращения к полям по порядку, а проблема в правильном индексировании.)
0
artemav
0 / 0 / 0
Регистрация: 12.02.2013
Сообщений: 18
14.04.2013, 18:58  [ТС] 10
Новую тему предлагаете создать?
0
Монфрид
1211 / 1021 / 293
Регистрация: 07.03.2012
Сообщений: 3,243
Завершенные тесты: 2
14.04.2013, 19:05 11
у вас какая VS? framework? пространства имён какие подключены
0
artemav
0 / 0 / 0
Регистрация: 12.02.2013
Сообщений: 18
14.04.2013, 19:07  [ТС] 12
Монфрид,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Reflection;
 
namespace ConsoleApplication1
{
  public class TargetHuman
    {
     public int Num = 0;
     public string GivName = "";
     public char MidInit = ' ';
     public string Surname = "";
     public bool Gender = true;
     public string City = "";
     public string State = "";
     public string Email = "";
     public string TelNum= "";
     public string DateOfB = "";
     public string Occup = "";
     public string Company = "";
     public string Weight = "";
     public int Height = 0;
     public string StAdress = "";
     public int Zip = 0;
     public string Country ="";
 
    }
    class Program
    {
        
        
        static void Main(string[] args)
        {
            StreamReader sr = new StreamReader("C:/data.txt");
            string Line;
            int k = -1;
            TargetHuman[] arr = new TargetHuman[10000];
            while (((Line = sr.ReadLine()) != null)  && ((Line = sr.ReadLine()) != "Number,GivenName,MiddleInitial,Surname,Gender,City,State,EmailAddress,TelephoneNumber,Birthday,Occupation,Company,Kilograms,Centimeters,StreetAddress,ZipCode,Country"))
            {
                k++;
                string[] splitedValues=Line.Split(new char[]{','});
                TargetHuman human = new TargetHuman();
                PropertyInfo[] properties=human.GetType().GetProperties();
            for (int i=0;i<splitedValues.Count();i++)
                {
                    properties[i].SetValue(human, Convert.ChangeType(splitedValues[i],properties[i].PropertyType),null);
                }
//потом добавляете human в массив
            }
            }
        }
}
framework 4.5 он вроде , vs 2010
0
Монфрид
1211 / 1021 / 293
Регистрация: 07.03.2012
Сообщений: 3,243
Завершенные тесты: 2
14.04.2013, 19:14 13
дебажить умеете? поставьте точку останова, посмотрите что в splitedValues у вас. И сколько properties в массиве, должны совпадать по количеству
0
artemav
0 / 0 / 0
Регистрация: 12.02.2013
Сообщений: 18
14.04.2013, 20:37  [ТС] 14
Монфрид, properties как я вижу вообще не массив, вот скрин
0
Миниатюры
Обращения к полям класса по порядку  
Tsin
722 / 467 / 183
Регистрация: 30.12.2012
Сообщений: 1,265
Записей в блоге: 2
Завершенные тесты: 3
14.04.2013, 21:13 15
Тюю, так тут вот в чем проблема оказывается..конечно у тебя Properties не будет в классе! У тебя же там только поля. Переделай класс, заменив поля автоПропертями и все должно заработать :
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class TargetHuman
    {
     public int Num {get; set; };
     public string GivName {get; set; };
     public char MidInit {get; set; };
     public string Surname {get; set; };
     public bool Gender {get; set; };
     public string City {get; set; };
     public string State {get; set; };
     public string Email {get; set; };
     public string TelNum {get; set; };
     public string DateOfB {get; set; };
     public string Occup {get; set; };
     public string Company {get; set; };
     public string Weight {get; set; };
     public int Height {get; set; };
     public string StAdress {get; set; };
     public int Zip {get; set; };
     public string Country {get; set; };
 }
1
artemav
0 / 0 / 0
Регистрация: 12.02.2013
Сообщений: 18
14.04.2013, 22:34  [ТС] 16
Tsin, честно не знаю что это) ткните носом где почитать
0
Tsin
722 / 467 / 183
Регистрация: 30.12.2012
Сообщений: 1,265
Записей в блоге: 2
Завершенные тесты: 3
14.04.2013, 23:11 17
artemav, так я же написал как надо класс переделать)

Вот статья на msdn : http://msdn.microsoft.com/ru-ru/library/bb384054.aspx

Или вкратце. Прочитай, что такое Properties (или Свойства, если по-русски). А потом представь, что в свойстве не надо ничего писать, кроме get; и set; и что свойство само сгенерит за тебя приватное поле (переменную)
То есть, если бы ты раньше написал
C#
1
2
3
4
5
6
7
8
9
10
11
class MyClass
{
    private int _field;
    public int Field
    {
        get
        { return _field; }
        set
        { _field = value; }
    }
}
то теперь можешь писать попросту
C#
1
2
3
4
class Myclass
{
    public int Field {get; set;}
}
1
artemav
0 / 0 / 0
Регистрация: 12.02.2013
Сообщений: 18
14.04.2013, 23:19  [ТС] 18
Спасибо, понял. С конвертером сам поди разберусь)
0
Tsin
14.04.2013, 23:26
  #19

Не по теме:

artemav, удачи) Рефлексия - это здорово!

0
adm_loro
Заблокирован
15.04.2013, 00:16 20
Цитата Сообщение от artemav Посмотреть сообщение
class TargetHuman
у тебя поля в классе все закрытые, и как ты собираешься к ним обращаться вне класса? ок. увидел ответ.

но это слишком искусственная задача и рефлексию так совсем не стоит применять.
0
15.04.2013, 00:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2013, 00:16

Доступ к полям у класса-наследника
есть следующая иерархия классов: abstract class A { bool flag; } ...

Как пройтись по всем полям класса?
А можно как пройтись по всем полям класса? Например есть класс: class...

Доступ к полям дочернего класса из родительского
Вопрос это нормально что this.GetType() Возвращает тип дочернего класса а не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru