2009-06-09 9 views
15

pregunta simple, es de esperar una respuesta sencilla:¿Accesorio con un conjunto diferente y obtener tipos?

me gustaría hacer lo siguiente:

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 
} 

Lo anterior es sólo un ejemplo de lo que estoy tratando de hacer. Me gustaría tener un acceso público a una variable interna de tipo x. Quiero obtener esa variable como una cadena, pero configurarla usando algo de tipo x.

¿Esto es posible?

--edit--

Me di cuenta de que podía hacer algo como:

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 
} 

Pero entonces, vamos digo yo uso escriba y en lugar de una "cadena" como mi tipo 'conseguir' . Si quiero usar "DateTimeProperty" en otro lugar de mi código, debería lanzarlo.

+1

Le recomiendo a usted no utiliza el código en tu edición. Aparte de un extraño cambio de convención, esto podría tener un ligero rendimiento y graves problemas de localización. –

+8

No te atrevas a escribir ese código. – mquander

Respuesta

8

No. Obviamente se puede añadir el .ToString() en el código de llamada, pero no se puede hacer lo que se propone sin diferentes nombres como esta:

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

O, aún mejor métodos de uso en lugar de propiedades (según se indica en los comentarios):

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

tener en cuenta que es para var implícitamente, en tiempo de compilación escrito var iables, no variables dinámicas.

Definitivamente no haga lo que anotó en su edición. Introdujo una ruptura en la convención, posibles implicaciones de rendimiento (aunque leve) y problemas de localización significativos.

+9

Si va a utilizar GetDateTime y SetDateTime, realmente deberían ser métodos en lugar de propiedades. –

+0

¿Puedo preguntar por qué uno haría estos métodos en lugar de propiedades? – Nick

+8

@Nick: Porque los métodos son como verbos que hacen algo con un objeto y las propiedades son como sustantivos que dicen algo sobre el objeto. SetDateTime y GetDateTime son verbos, por lo tanto, deberían ser métodos. –

5

Como propiedad, esto no es posible. Puede hacer que los métodos Get y Set sean de diferentes tipos, pero para una propiedad los tipos deben ser iguales.

EDIT:

bien:

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 
} 

es sintácticamente correcta, se compilará y le permite aceptar DateTime como entrada y devuelve una cadena, esto no sería un buen plan. Funciona, pero hace que usted y cualquier persona que acceda a este código, realice una validación innecesaria. Además, es vulnerable a otro desarrollador en el futuro, sin saber, o al darse cuenta de las reglas implícitas, para las cuales ha perdido la seguridad del tiempo de compilación. Además, apenas hay más código para crear dos propiedades, o dos métodos que logren el mismo objetivo, de una manera fuertemente tipada.

Personalmente, recomendaría usar dos métodos (vea el comentario de Jeff Yates para una buena explicación de por qué).

private DateTime m_internalDateTime; 
public string GetDateTime() 
{ 
    return m_internalDateTime.ToString(); 
} 

public void SetDateTime(DateTime dateTime) 
{ 
    m_internalDateTime = dateTime; 
} 
3

No de esa manera, pero ciertamente puede tener una segunda propiedad que accede al campo m_internalDateTime.

public string DateTimeString 
{ 
    get { return m_internalDateTime.ToString(); } 
} 
0

Respuesta simple no, a su código externo su propiedad se comportará de la manera exacta que un campo lo haría, no puede tener una propiedad con diferentes tipos de ajuste/obtención así como no podría tener un archivo con un escriba y cuando solicite su valor, devuelva un tipo diferente.

0

¿qué tal:

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);   
     } 
} 
3

Tal vez eso ayuda

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; 
} 
Cuestiones relacionadas