Перегрузка свойств в C # - PullRequest
       26

Перегрузка свойств в C #

16 голосов
/ 09 апреля 2010

Хорошо, я знаю, что перегрузка свойств не поддерживается в C # - большинство ссылок объясняют это, ссылаясь на проблему single-method-different-returntype. Однако как насчет сеттеров? Я хотел бы напрямую присвоить значение в виде строки или объекта, но вернуть только в виде строки.

Как это:

    public string FieldIdList
    {
        get { return fieldIdList.ToString(); }
        set { fieldIdList = new FieldIdList(value); }
    }

    public FieldIdList FieldIdList 
    {
        set { fieldIdList = value; }
    }
    private FieldIdList fieldIdList;

Почему бы этого не допустить? Я также видел, что «свойства» просто создают функции получения / установки при компиляции. Будет ли возможно создать свой собственный? Что-то вроде:

    public void set_FieldIdList(FieldIdList value)
    {
        fieldIdList = value;
    }

Это сделало бы то же самое. Мысли?

Ответы [ 4 ]

7 голосов
/ 09 апреля 2010

Свойства на самом деле представляют собой пару методов get / set (один из которых может быть опущен), но само свойство имеет дополнительные метаданные, что делает его свойством в первую очередь вместо двух методов.

Поскольку подпись свойства остается недействительной по типу «только разные при возврате», даже если у вас есть только установщик. Если вам это нужно, не используйте свойство; Свойства только для набора не очень хорошая вещь.

1 голос
/ 09 апреля 2010

Один из подходов (вы можете спорить между собой относительно того, является ли это хорошим выбором дизайна или нет) - добавить второе свойство, которое обращается к данным в другой форме.

Однако, так как будет выполняться разбор строки (выполнение значительной работы), было бы лучше не использовать для этого свойство, а добавить методы, позволяющие получать / устанавливать данные в виде строки.

Я бы пошел за fieldIdList, предоставляющим интерфейсы ToString () и TryParse () - тогда, если вам нужно это как строка, вы бы вызвали myObject.FieldIdList.ToString () и т. Д. Это аккуратно инкапсулирует все, позволяет конвертировать в / из строковых форматов в любом месте вашего кода, а не только при доступе к FieldIdLists в качестве члена некоторого другого класса, и делает клиентский код действительно ясным и простым для понимания.

0 голосов
/ 13 февраля 2019

Вы не можете перегрузить свойства C # с C # 7.

Однако, редизайн, включающий вашу собственность, возможен .

Вы можете использовать условие в блоке set для вызова частной функции, который может быть перегружен.

public string FieldIdList
{
    get { return fieldIdList.ToString(); }
    set { fieldIdList = ChangeFieldList(23); }
}

private string ChangeFieldIdList(int i) {
    return i.ToString();
}

Этот пример просто не означает, что нужно рассмотреть вопрос о редизайне с использованием частных функций. вызываться в заданном блоке.

0 голосов
/ 09 апреля 2010

Если вы хотите иметь возможность установить свойство в виде строки или объекта, вам следует просто использовать объект в качестве типа свойства, поскольку это базовый класс (вы можете передать строку свойству, которое принимает объект). Это не очень хорошее дизайнерское решение, но оно может быть сделано. Возможно, вам нужно объяснить, чего вы пытаетесь достичь?

...