0

Здравствуйте! Я добавляю в ArrayList два объекта. Как можно получить доступ к их полям?

ArrayList arraylist = new ArrayList();
Test test = new Test();
Test2 test2 = new Test2();

arraylist.Add(test);
arraylist.Add(test2);

2 ответа 2

2

Пользуясь (давно устаревшим) ArrayList, вы теряете информацию о типах положенных в него объектов. Поэтому вам придётся делать явный cast с риском ошибиться и не угадать нужный тип.

Скорее всего, вам нужен типизированный List<Test>. В вашем примере вы записываете в список два разнородных объекта; скорее всего, вам это не нужно, вам нужно либо несколько отдельных списков, либо просто отдельные переменные (либо один из типов является подтипом другого).

7
  • Ну по заданию, у меня есть класс, от которого наследуются еще 6. И объекты этих 6 классов мне надо поместить в коллекцию. Можно ли это как-нибудь осуществить? Пример я привел для краткой сути того, что мне надо.
    – SlowAR
    21 дек 2014 в 11:02
  • @SlowAR: Заведите List<T>, где T — тип общего предка.
    – VladD
    21 дек 2014 в 11:03
  • Я пробовал так делать, но в итоге имею доступ к полям только общего предка
    – SlowAR
    21 дек 2014 в 11:04
  • 1
    @SlowAR: Разумеется. А как может быть иначе? Если list[i] может быть любого производного типа, как компилятор может знать, какие из полей производного класса там есть? И как вы можете это знать? --- Расскажите, зачем вам доступ к полям конкретных классов в списке.
    – VladD
    21 дек 2014 в 11:06
  • ну, например, чтобы занести в поле другое значение
    – SlowAR
    21 дек 2014 в 11:11
1

Использовать в типизированной коллекции можно так:

public class BaseClass
{
    public virtual string GetAbout()
    {
        return "I'm BaseClass";
    }
}

//======================================================

public class InheritedClass : BaseClass
{
    public int Age { get; set; }

    public int GetAge()
    {
        return this.Age;
    }

    public override string GetAbout()
    {
        return "I'm InheritedClass";
    }
}

//======================================================

List<BaseClass> collect = new List<BaseClass>();

collect.Add(new InheritedClass());
collect.Add(new BaseClass());

foreach(var item in collect)
{
    Console.WriteLine(item.GetAbout());

    var inheritedItem = item as InheritedClass;

    if(inheritedItem != null)
    {
        Console.WriteLine(inheritedItem.GetAge());
    }
}

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.