Аксессуар с разными типами set и get?
Вопрос
Простой вопрос, надеюсь, на него будет простой ответ:
Я бы хотел сделать следующее:
private DateTime m_internalDateTime;
public var DateTimeProperty
{
get { return m_internalDateTime.ToString(); } // Return a string
set { m_internalDateTime = value; } // here value is of type DateTime
}
Вышесказанное - всего лишь пример того, что я пытаюсь сделать.Я бы хотел иметь общедоступный доступ к внутренней переменной типа x.Я хочу получить эту переменную в виде строки, но установить ее, используя что-то типа x.
Возможно ли это?
--редактировать--
Я просто понял, что мог бы сделать что-то вроде:
private DateTime m_internalDateTime;
public object DateTimeProperty
{
get { return m_internalDateTime.ToString(); } // Return a string
set { m_internalDateTime = (DateTime)value; } // here value is of type DateTime
}
Но тогда, допустим, я использую тип y вместо "string" в качестве моего типа 'get'.Если я хочу использовать "DateTimeProperty" в другом месте моего кода, мне пришлось бы его применить.
Решение
Нет.Очевидно, вы можете добавить .toString() в вызывающий код, но вы не сможете сделать то, что предлагаете, без таких разных имен, как это:
private DateTime m_internalDateTime;
public DateTime SetDateTime { set { m_internalDateTime = value; } }
public string GetDateTime { get { return m_internalDateTime.ToString(); } }
Или, еще лучше, использовать методы вместо свойств (как указано в комментариях):
private DateTime m_internalDateTime;
public void SetDateTime(DateTime dateTime) { m_internalDateTime = dateTime; }
public string GetDateTime() { return m_internalDateTime.ToString(); }
Имейте в виду , что var
является для неявно, введенный во время компиляции variables, а не динамичный переменные.
Определенно не делайте этого сделайте то, что вы отметили в своей правке.Это привело к нарушению соглашения, возможным последствиям для производительности (хотя и незначительным) и значительным проблемам с локализацией.
Другие советы
Как свойство, нет, это невозможно.Вы могли бы создать методы Get и Set разных типов, но для свойства типы должны быть одинаковыми.
Редактировать:
В то время как:
private DateTime m_internalDateTime;
public object DateTimeProperty
{
get { return m_internalDateTime.ToString(); } // Return a string
set { m_internalDateTime = (DateTime)value; } // here value is of type DateTime
}
синтаксически корректен, будет компилироваться и позволит вам принимать DateTime в качестве входных данных и возвращать строку, это не было бы хорошим планом.Это работает, но это заставляет вас и любого, кто получает доступ к этому коду, выполнять ненужную проверку.Кроме того, он уязвим для другого разработчика в будущем, не знающего или осознающего неявные правила, из-за чего вы потеряли безопасность во время компиляции.Кроме того, вряд ли осталось больше кода для создания либо двух свойств, либо двух методов, которые достигают одной и той же цели строго типизированным способом.
Лично я бы рекомендовал использовать два метода (хорошее объяснение причин см. В комментарии Джеффа Йейтса).
private DateTime m_internalDateTime;
public string GetDateTime()
{
return m_internalDateTime.ToString();
}
public void SetDateTime(DateTime dateTime)
{
m_internalDateTime = dateTime;
}
Не таким образом, но у вас, безусловно, может быть второе свойство, которое обращается к полю m_internalDateTime .
public string DateTimeString
{
get { return m_internalDateTime.ToString(); }
}
Может быть, это поможет
public class TDecimal
{
private decimal? m_value;
public bool HasValue { get { return m_value.HasValue; } }
public decimal Value { get { return m_value.Value; } }
public static implicit operator TDecimal(string a_value)
{
decimal d;
if (decimal.TryParse(a_value, out d))
{
return new TDecimal() {m_value = d};
}
return new TDecimal() {m_value = null};
}
public static implicit operator decimal(TDecimal a_value)
{
if(a_value.HasValue)
{
return a_value.Value;
}
throw new ArgumentNullException("a_value");
}
}
public class A
{
public TDecimal Prop { get; set; }
}
A a = new A();
a.Prop = "123";
if (a.Prop.HasValue)
{
decimal d = a.Prop;
}
Простой ответ нет, для вашего внешнего кода ваше свойство будет вести себя точно так же, как и поле, у вас не может быть свойства, имеющего разные типы set / get, точно так же, как вы не могли бы задать файл с типом, и когда вы запрашиваете его значение, вы получаете обратно другой тип.
как насчет:
private DateTime intDT;
public string DateTimeProperty
{
get { return intDT.ToString(); } // Return a string
set
{
DateTime dt;
if (DateTime.TryParse(value, out dt))
intDT = dt;
else throw new ArgumentException(string.Format(
"{0} cannot be converted to a DateTime.", value);
}
}