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