Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.
Внимание! Некоторое время письма не доходят до аккаунтов MAIL RU GROUP, не доходят на все почтовые ящики mail.ru, inbox.ru, bk.ru. Пишите им жалобы, чтобы быстрее восстановили получение писем, регистрируйтесь через яндекс почту и gmail, туда письма с активизацией доходят.

Вернуться   Форум программистов > .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
Адрес: Москва
Сообщений: 20,997
Репутация: 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


00:20.


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

RusProfile.ru


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