Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

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

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

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

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

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

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

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

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

Если классов не так много (до 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 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ООП: доступ к полям наследника через предка 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