Расширение класса String со свойствами? - PullRequest
2 голосов
/ 30 января 2009

У меня есть приложение, в котором мне нужно заполнить текстовое поле с названием компании, и я заполнил пользовательский AutoCompleteStringColection всеми доступными названиями компаний из базы данных. Когда пользователь вводит изменение названия компании, набирая и выбирая из списка новое название компании, мне нужен идентификатор (Guid) выбранной компании, чтобы я мог выполнить поиск и получить остальную информацию о компании. Поскольку название компании не гарантированно уникально, я не могу найти название и ожидать правильной записи. Я посмотрел на расширение класса string, но все, что я могу найти, это примеры, которые добавляют методы. Я попробовал это, добавив переменную для хранения идентификатора и методы для получения и установки идентификатора, но при получении идентификатора это всегда последний установленный идентификатор. Можно ли добавить свойство в класс, расширив его? Я уже изменил то, что пытался сделать, чтобы найти название компании и отобразить список, из которого пользователь выберет, если будет возвращено несколько совпадений, но я все же хотел бы знать, могу ли я добавить свойство таким способом в случае, если это приходит снова.

Ответы [ 4 ]

7 голосов
/ 30 января 2009

Нет, вы не можете расширять классы свойствами. Кроме того, String равно sealed, поэтому вы не можете расширить его путем наследования. Единственный выход - составить: инкапсулировать string в вашем собственном классе.

2 голосов
/ 30 января 2009

Похоже, вы должны создать свой собственный класс:

class Company {
    public string Name {get;set;}
    public override string ToString() {return Name;}
    // etc
}

Теперь привязка к набору Company объектов; переопределение ToString обеспечит отображение Name по умолчанию, и вы можете добавить все, что вам нужно. В более сложных сценариях вы можете использовать (например) DisplayMember и ValueMember (из поля со списком), чтобы указывать на другие свойства (вместо значения по умолчанию ToString).

1 голос
/ 30 января 2009

Вы должны использовать ComboBox, а не TextBox. Создайте пользовательский тип с именем и идентификатором вашей компании, убедившись, что он переопределяет ToString для возврата названия компании. Добавьте эти пользовательские типы в ComboBox вместо прямых строк и используйте AutoCompleteSource для ListItems.

0 голосов
/ 13 июня 2009

Я использовал ответ Конрада и ради полноты я выкладываю здесь свое решение. Мне нужно было показать моему пользователю список автозаполнения названий компаний, но, поскольку у них могло быть несколько компаний с одинаковым именем, мне понадобился идентификатор Guid, чтобы найти их выбор в базе данных. Поэтому я написал свой собственный класс, унаследованный от AutoCompleteStringCollection.

    public class AutoCompleteStringWithIdCollection : AutoCompleteStringCollection
{
    private List<Guid> _idList = new List<Guid>();


    /*-- Properties --*/

    public Guid this[int index]
    {
        get
        {
            return _idList[index];
        }
    }

    public Guid this[string value]
    {
        get
        {
            int index = base.IndexOf(value);
            return _idList[index];
        }
    }

    /*-- Methods --*/

    public int Add(string value, Guid id)
    {
        int index = base.Add(value);
        _idList.Insert(index, id);
        return index;
    }

    public new void Remove(string value)
    {
        int index = base.IndexOf(value);
        if (index > -1)
        {
            base.RemoveAt(index);
            _idList.RemoveAt(index);
        }
    }

    public new void RemoveAt(int index)
    {
        base.RemoveAt(index);
        _idList.RemoveAt(index);
    }

    public new void Clear()
    {
        base.Clear();
        _idList.Clear();
    }

}
...