get;set; con fecha y hora de validar con .TryParse?

Estoy tratando de pasar la validación de datos de entrada en el get;set; de una clase de estructura.

public void PlotFiles()
    {

     List<DTVitem.item> dataitems;
        DTVitem.item i;
        DateTime.TryParse("2012/01/01", out i.dt);
        DateTime.TryParse("04:04:04", out i.t);
        int.TryParse("455", out i.v);
        dataitems.Add(i);

    }

La estructura es declarado en una clase independiente (probablemente innecesaria):

public partial class DTVitem
{
    public struct item
    {
        public DateTime dt;
        public DateTime t;
        public int v;
    }
}

Cada vez que DTVitem.item.dt, DTVitem.item.t, o DTVitem.item.v, deseo que se realice la pertinente .TryParse() para validar el contenido de la propiedad.

Sin embargo, cuando intento usar TryParse() de la siguiente manera (tratando de envolver mi cabeza alrededor de este ejemplo de MSDN):

public partial class DTVitem
{
    private DateTime _datevalue;

    public string dt
    {
        get { return _datevalue; }
        set { DateTime.TryParse(value, out _datevalue) ;}
    }
}

Me aparece el error que _datevalue is a DateTime and cannot be converted to a string. La razón es, obviamente, que el camino de retorno debe devolver el tipo de dt en esta instancia (un string). Sin embargo, he tratado de masaje de este un par de maneras diferentes, y no soy capaz de entrar ilegalmente en él.

¿Cómo puedo lograr mi objetivo de la validación de un string valor como un DateTime cuando se establece como una propiedad de una instancia de la estructura?

Es el uso de set como estoy tratando de la mejor manera?

Puedo ver que hay un montón de valor en el uso de get;set; para la validación y realmente me gustaría entenderlo.

Muchas gracias,

Matt

[editar]

Gracias a Jon Skeet a continuación para señalar el error de mis caminos.

Aquí hay otro hilo sobre problemas con mutable structs, y otro hablando de crear una instancia de un struct. Nota las estructuras son tipos de valor.

Creo que el resto de lo que él estaba señalando es una especie de solo de acuerdo en que enterrar la estructura manera lejos no es necesario, y que debo revisar por qué lo estoy haciendo.

[solución]

He tenido en cuenta algunas recomendaciones que figuran a continuación y llegado a la siguiente:

public partial class DTVitem
{
    private DateTime _dtvalue, _tvalue;
    private int _vvalue;

    public string dt
    {
        get { return _dtvalue.ToString(); }
        set { DateTime.TryParse(value, out _dtvalue); }
    }

    public string t
    {
        get { return _tvalue.ToString(); }
        set { DateTime.TryParse(value, out _tvalue); }
    }

    public string v
    {
        get { return _vvalue.ToString(); }
        set { int.TryParse(value, out _vvalue); }
    }
}

Dentro de mi programa de clase, he creado una instancia y fijar con los siguientes:

DTVitem item = new DTVitem();
item.dt = "2012/01/01";
item.t = "04:04:04";
item.v = "455";

Así que he optado por no utilizar una estructura, sino una clase; o realmente una instancia de la clase.

  • Es muy claro por qué tienes un público mutable estructura con campos públicos como un tipo anidado dentro de DTVitem. Todos aquellos parecer una mala idea para mí.
  • Su error es porque te estás volviendo un DateTime en el get de la propiedad para la que se declara como string.
  • Obtener y Establecer sólo debe recibir y definir una variable. Suena como una clase sería más útil de una estructura, al menos de la manera que usted la usa. El llamado debe ser responsable por el uso de una fecha y hora válidos no struct/clase.
  • No es cierto en absoluto. Usted puede encapsular la funcionalidad en una propiedad, incluyendo la validación. No hay razón para copiar el código de validación alrededor o poner las llamadas a todas partes establece la propiedad
  • Gracias Juan por señalar el terrible defecto. Yo no soy un dev por el comercio, por lo que soy «a todo vapor hacia adelante»ing esto. Voy a mirar en que, como es claramente un defecto fundamental. Usted podría ser más constructivo y asesorar en más detalle, salvo el detalle es tan enorme que puedo referir de nuevo a mi última frase. Gracias Ryan, voy a mirar en esa dirección.
InformationsquelleAutor mbrownnyc | 2013-02-19

5 Kommentare

  1. 3

    Una propiedad sólo puede tener un tipo. Si desea que la propiedad de tipo string, entonces usted puede implementar de esta manera:

    public partial class DTVitem
    {
        private DateTime _datevalue;
    
        public string dt
        {
            get { return _datevalue.ToString(); }
            set { DateTime.TryParse(value, out _datevalue) ;}
        }
    }

    Sin embargo, el uso de TryParse() significa que el setter no lanzar una excepción si la DateTime no es válido. Si usted desea hacer esto, usar DateTime.Parse() en su lugar.

    • Gracias voy a ver esto como una posibilidad y después de volver con la respuesta.
  2. 1
    public partial class DTVitem
    {
        private DateTime _datevalue;
    
        public string dt
        {
            get { return _datevalue.ToString(); }
            set { DateTime.TryParse(value, out _datevalue) ;}
        }
    }
    • Gracias voy a ver esto como una posibilidad y después de volver con una respuesta.
  3. 1

    Estás solo falta un tipo de conversión en el get. _datevalue es un DateTime, pero su propiedad una cadena.

    get { return _datevalue.ToString(); } //or .toShortDateString() or ToShorttimeString()
    • Gracias por señalar que el conjunto de funciones.
  4. 0

    El get;set; deben tener el mismo tipo. Su conseguir devuelve un datetime cuando se espera una cadena, de ahí el error.

    sólo utilizar un método explícito bool setDate(Cadena datestring) y poner el código ahí. Usted puede devolver un valor booleano de la tryparse de saber si fue un éxito.

  5. 0

    Otros (diseño de la mayoría de los casos) a un lado los problemas, sólo para llegar a el problema de la devolución de _datevalue como una cadena de texto, usted puede simplemente hacer algo como:

    public string dt
    {
        get { return _datevalue.ToString(); }
        set { if(!DateTime.TryParse(value, out _datevalue)) /* Error recovery!! */ ;}
    }

    >>> puede que también desee comprobar la documentación de las DateTime.ToString() y ver qué formato desea obtener la cadena en cuando se accede a la propiedad.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea