Accessor with different set and get types?

Nick picture Nick · Jun 9, 2009 · Viewed 22k times · Source

Simple question, hopefully a simple answer:

I'd like to do the following:

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
}

The above is just an example of what I'm trying to do. I'd like to have a public accessor to an internal variable of type x. I want the get that variable as a string, but set it using something of type x.

Is this possible?

--edit--

I just realized I could do something like:

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
}

But then, let say I use type y instead of a "string" as my 'get' type. If I want to use "DateTimeProperty" else where in my code, I'd have to cast it.

Answer

Michael Haren picture Michael Haren · Jun 9, 2009

No. You can obviously add the .ToString() in the calling code, but you can't do what you propose without different names like this:

private DateTime m_internalDateTime;
public DateTime SetDateTime { set { m_internalDateTime = value; } }
public string GetDateTime   { get { return m_internalDateTime.ToString(); } } 

Or, even better to use methods instead of properties (as noted in the comments):

private DateTime m_internalDateTime;
public void SetDateTime(DateTime dateTime) { m_internalDateTime = dateTime; }
public string GetDateTime() { return m_internalDateTime.ToString(); }

Keep in mind that var is for implicitly, compile-time typed variables, not dynamic variables.

Definitely do not do what you noted in your edit. It introduced a break in convention, possible performance implications (albeit slight), and significant localization problems.