Accessor с разными наборами и типами получения? - PullRequest
18 голосов
/ 09 июня 2009

Простой вопрос, надеюсь, простой ответ:

Я бы хотел сделать следующее:

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. Я хочу получить эту переменную в виде строки, но установить ее, используя что-то типа х.

Возможно ли это?

- изменить -

Я только что понял, что могу сделать что-то вроде:

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 где-нибудь еще в моем коде, мне придется его преобразовать.

Ответы [ 6 ]

10 голосов
/ 09 июня 2009

Нет. Очевидно, вы можете добавить .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 для неявно , время компиляции набрано var iables, а не динамические переменные.

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

5 голосов
/ 09 июня 2009

Как собственность, нет, это невозможно. Вы можете создавать методы Get и Set разных типов, но для свойства типы должны быть одинаковыми.

EDIT:

В то время как:

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;
}
3 голосов
/ 25 марта 2010

Может быть, это помогает

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;
}
3 голосов
/ 09 июня 2009

Не так, но вы, безусловно, можете иметь второе свойство, которое обращается к полю m_internalDateTime.

public string DateTimeString
{
   get { return m_internalDateTime.ToString(); }
}
0 голосов
/ 10 июня 2009

как насчет:

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);           
      } 
}
0 голосов
/ 09 июня 2009

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

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