Вопрос

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

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

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);           
      } 
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top