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

Хорошо, я знаю, что перегрузка свойств не поддерживается в С# - большинство ссылок объясняют это, ссылаясь на проблему 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;

Почему это не допустимо? Я также видел, что "свойства" просто создают функции getter/setter при компиляции. Можно ли создать собственное? Что-то вроде:

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

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

Ответ 1

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

Поскольку подпись свойства остается недействительной только по-разному по обратному типу, даже если у вас есть только сеттер. Если вам это нужно, не используйте свойство; свойства set-only не всегда хороши.

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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

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

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

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

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