Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > .NET > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 04.05.2014, 12:59   #1
Николавна
Новичок
 
Регистрация: 04.05.2014
Сообщений: 2
Репутация: 10
По умолчанию Не получается пройтись по коллекции через foreach и получить доступ к полям

Добрый день.
Есть коллекция<object>, которая содержит экземпляры различных классов,например мост, здание.
У классов большая часть одинаковых полей (например материал, ширина), но есть и индивидуальные для класса.

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

Пройтись по элементам коллекции можно используя общий интерфейс для всех классов, но тогда мне придется в общем интерфейсе прописать абсолютно все поля классов, и реализовать в классах поля , которые к классу отношения не имеют.
Не подскажите как выйти из ситуации?
Николавна вне форума   Ответить с цитированием
Старый 04.05.2014, 13:07   #2
Пепел Феникса
Модератор
Заслуженный модератор
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 21,006
Репутация: 3402

icq: 446843180
skype: phoenix_proger
По умолчанию

как вариант тест и приведение типов.
иной вариант через рефлексию.
__________________
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума   Ответить с цитированием
Старый 04.05.2014, 14:36   #3
Николавна
Новичок
 
Регистрация: 04.05.2014
Сообщений: 2
Репутация: 10
По умолчанию

Если делать приведение типов то придется каждый элемент в коллекции сначала проверять относится ли он к определенному классу а только потом делать приведение типов. код будет большой, так как классов много.
Николавна вне форума   Ответить с цитированием
Старый 04.05.2014, 16:22   #4
yarik111475
 
Регистрация: 04.05.2014
Сообщений: 5
Репутация: 10
По умолчанию

Покажите ваш код. Думаю все проще чем вы думаете.
yarik111475 вне форума   Ответить с цитированием
Старый 04.05.2014, 16:30   #5
Luuzuk
Участник клуба
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Адрес: Самара
Сообщений: 975
Репутация: 605

icq: З7ЧЗЗ89Ч5
По умолчанию

Одинаковые поля вынести в интерфейс, а остальные - по приведению типов. Кода все равно будет много раз классов много.
P.S. сам бы сделал на основе паттерна Visitor. Если осилите, то и вам советую
__________________
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума   Ответить с цитированием
Старый 04.05.2014, 16:44   #6
yarik111475
 
Регистрация: 04.05.2014
Сообщений: 5
Репутация: 10
По умолчанию

Если классов не так много (до 10), то все можно проще сделать. Пройтись по всей коллекции с проверкой на то, какой тип на данной итерации, и через приведение типов работать с ним.
Код:

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

namespace ConsoleApplication7
{
    class Program
    {
        static void Main(string[] args)
        {
            ArrayList myList = new ArrayList()
            {
                new classA{Name="ClassA",PersonalNameA="A"},
                new classB{Name="ClassB",PersonalNameB="B"}
            };
            foreach (object obj in myList)
            {
                if (obj is classA)
                {
                    ((classA)obj).PersonalNameA = "New Personal Name A";
                }
                else if (obj is classB)
                {
                    ((classB)obj).PersonalNameB = "New Personal Name B";
                }
            }
        }
    }
    public class classA
    {
        public string Name { get; set; }
        public string PersonalNameA { get; set; }
    }
    public class classB
    {
        public string Name { get; set; }
        public string PersonalNameB { get; set; }
    }
   
}

yarik111475 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ООП: доступ к полям наследника через предка Khayzenberg Общие вопросы Delphi 23 05.04.2014 10:19
Через какую библиотеку можно получить доступ к COM объектам браузера wanes101 Win Api 7 11.05.2013 10:11
Kак получить доступ к чужой веб-камере через интернет? remont_it, C++ Builder 4 18.01.2013 15:55
Не получается получить значение из функции через указатель Casper-SC Общие вопросы C/C++ 5 12.01.2012 06:32
Получить доступ к скринсейверу через реестр Vask Общие вопросы Delphi 1 24.09.2008 21:12


05:48.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru