@missbells

Как создать поле типа Generic List в классе?

Подскажите, пожалуйста, как создать поле типа Generic List<T>в классе? Т.е. мне нужно, чтоб при создании экземпляра класса в поле можно было записать List любого типа - например, List<Album>или List<Photo>.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Lab1
{
    public partial class AddForm : Form
    {
        public string itemToAdd { get; set; }
	      public List<T> list { get; set; }

        public AddForm()
        {
            InitializeComponent();
        }

    }
}


Получаю ошибку The type or namespace name 'T' could not be found..
  • Вопрос задан
  • 878 просмотров
Пригласить эксперта
Ответы на вопрос 4
Комментировать
@kttotto
пофиг на чем писать
Если Вы хотите именно "при создании экземпляра класса в поле можно было записать List любого типа", то generic тип должен быть определен на стадии компиляции и если Вы явно не указали его тип, то компилятор пытается найти класс T в текущем пространстве имен, а его у Вас нет, от сюда и ошибка.

Если нужно внутри класса использовать generic поле, то и класс Вы должны определить тем же типом.
public partial class AddForm<T> : Form where T: class
{
    public string itemToAdd { get; set; }
    public List<T> list { get; set; }

    public AddForm()
    {
        InitializeComponent();
    }
}

И при создании экземпляра формы указать
var form = new AddForm<Album>()
В этом случае поле List будет типизированно типом Album.

Если же список внутри формы небольшой и можно пренебречь затратами на приведение типов, то можно сделать список типа object.
public partial class AddForm : Form
{
    public string itemToAdd { get; set; }
    public List<object> list { get; set; }

    public AddForm()
    {
        InitializeComponent();
    }
}

А доставать от туда по типу можно многими способами, например, если знаете заранее какой там тип то сделать привидение
var albums = form.list.Cast<Album>();
Если нет - то сделать фильтрацию по типу
var albums = form.list.OfType<Album>();
var photos = form.list.OfType<Photo>();
Ответ написан
Комментировать
@Codebaker
Всё умею, всё могу!
Мария, коллекция List умеет хранить объекты только одного типа, так что кажется, что положить в неё пару различных типов (Album и Photo) уже не получится. Но это только на первый взгляд.

На помощь может прийти один из китов ООП: наследование. Если вы сделаете свои типы Album и Photo наследниками от одного и того же базового типа, например от MyObject, то вы сможете создать в форме список из общих элементов: List.

Таким образом вы сможете складывать в этот список и Album и Photo, но, уверен, что следующим вопросом будет - а как достать их из этого списка. Приходите на Тостер снова. :-)
Ответ написан
@mefutu
В c# есть ArrayList в нем можно хранить объекты любого типа. Проверить какой объект можно конструкцией is/as. Либо можно просто использовать List.

https://metanit.com/sharp/tutorial/4.3.php
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы