Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Наследование List<T>


Автор: drdoom 23.1.2009, 16:15
У меня наверно глупый вопрос, как отнаследовать List<T>?
мне надо в класс этот добавить свойство Name, ну чтобы она именнованная была. мучал гугл и форумы не нашел инфы

Автор: nmn 23.1.2009, 16:19
Код

class newList<T> : List<T>
        { }

Автор: drdoom 23.1.2009, 16:24
Спасибо)))

Автор: drdoom 23.1.2009, 18:10
вот я пронаследовал List<T> таким образом
Код

public class NamedList<T> : List<T>
    {
        private string name;
        public NamedList(string name)
        {
            this.name = name;
        }

        
        public override string ToString()
        {
            return name;
        }
    }

вот его экземпляр засовываю в CheckedListBox
Код

RealCheckedListBox.Items.Add(list);

а почему то на форме в листбоксе пишит просто Collection а не то имя что я для нее задал((

Автор: WarHog 23.1.2009, 19:32
нужно, чтобы значение свойства было выведено в ListBox'e? можно сделать так, но зачем?
Код

class NamedList<T> : List<T>
    {
        public string Name
        {
            get;
            set;
        }
        public NamedList(string name)
        {
            this.Name = name;
        }


        public override string ToString()
        {
            return Name;
        }
    }

и
Код

checkedListBox1.Items.Add(list.Name);

в единственном item'e ListBox'а будет значение свойства, задаваемое в конструкторе smile

Автор: drdoom 24.1.2009, 00:51
у меня лист этих классов
их там куча

Автор: Veitmen 24.1.2009, 12:15
Хм... Что то я не понял что вы хотите сделать... Вы хотите сделать свой лист? Навесить на него какие свойства методы которых нет в List<T>? Или вы хотите содержимое листа запихать в ListBox?

Автор: PashaPash 24.1.2009, 15:32
Что ж вы все такие непонятливые...
drdoom, на самом деле в msdn по ListBox.ObjectCollection.Add не хватает пары деталей. Для item действительно вызывается ToString(), но только если класс item-а не заявляет что для его преобразования нужно использовать TypeConverter. А на List<T> кто-то поставил аттрибут c указанием CollectionConverter, который из любой строчки делает стандартный "(collection)". Тебе явно указать правильный конвертер для NamedList<T>, примерно так:
Код

class NamedListTTypeConverter : CollectionConverter
{
    public override bool CanConvertTo(ITypeDescriptorContext context, Type sourceType)
    {
        if (sourceType == typeof(string))
        {
            return true;
        }
        else
        {
            return base.CanConvertFrom(context, sourceType);
        }
    }

    public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
    {
        if (destinationType == typeof(string))
        {
            return value.ToString();
        }
        else
        {
            return base.ConvertTo(context, culture, value, destinationType);
        }
    }
}

[TypeConverter(typeof(NamedListTTypeConverter))]
class NamedList<T> : List<T>
{
    public string Name
    {
        get;
        set;
    }
    public NamedList(string name)
    {
        this.Name = name;
    }
    public override string ToString()
    {
        return Name;
    }
}

Автор: drdoom 24.1.2009, 17:21
спасибо, именно это и надо было мне услышать

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)