Может ли свойство C # принимать несколько значений? - PullRequest
8 голосов
/ 14 апреля 2009

Это может быть немного анти-паттерном, но для свойства в классе C # возможно принять несколько значений?

Например, скажем, у меня есть свойство Public int, и я всегда хочу, чтобы оно возвращало int, но я хотел бы иметь возможность установить свойство, назначая десятичный, целочисленный или какой-либо другой тип данных. Поэтому мой вопрос: возможно ли для свойств принимать несколько значений?

Ответы [ 5 ]

10 голосов
/ 14 апреля 2009

Я думаю, что вы хотите спросить: Как неявное и явное приведение к работе для int и decimal?

Вы спрашиваете о неявном приведении, которое автоматически прикрывает один объект к другому определенному типу. Вы не сможете сделать это для int и decimal, потому что они уже определены в платформе, и вы не сможете уменьшить область действия decimal, приведя его к int. Но если вы использовали это в качестве примера для реальных объектов, которые вы создали, вы можете использовать ссылку неявное выше, чтобы узнать больше о том, как это работает и как его реализовать.

Но вы всегда можете использовать метод convert для преобразования их в нужный тип;

public int MyProperty { get; set; }
...
obj.MyProperty = Convert.ToInt32(32.0M);
obj.MyProperty = Convert.ToInt32(40.222D);
obj.MyProperty = Convert.ToInt32("42");
2 голосов
/ 14 апреля 2009

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

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

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

public class MyClass {
  private Int32 mySomeValue;
  public void setSomeValue(Double value) { this.mySomeValue = Convert.ToInt32(value); }
  public void setSomeValue(Int32 value) { this.mySomeValue = value; }
}
1 голос
/ 14 апреля 2009

Похоже, вам нужно определить тип во время выполнения. Вы можете сделать так, чтобы свойство принимало объект, определяло тип и выполняло ваши действия. Разумеется, вам придется создавать исключения для вещей, которые вы не ожидаете. Как вы говорите, возможно, не самый лучший, но возможный. :)

0 голосов
/ 14 апреля 2009

Нет. Свойство имеет единственное значение. Вы можете присвоить ему все, что угодно, для переменной того же типа.

0 голосов
/ 14 апреля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...