Pourquoi ne puis-je pas appeler une méthode DateTime sur un objet DateTime dans une autre classe en C#
-
26-12-2019 - |
Question
J'ai trouvé quelques exemples de ce problème dans d'autres langages tels que Ruby ou PHP et ils semblent indiquer que j'aurais besoin d'une sorte d'inclusion pour prendre en charge cela, mais je n'arrive pas à le comprendre exactement.
J'ai:
private void setLoansView(Member _member)
{
foreach (Loan loan in _member.Loans)
{
this.dt.Rows.Add(_member.Name, // dt is a datatable
loan.BookOnLoan.CopyOf.Title,
loan.TimeOfLoan.ToShortDateString(),
loan.DueDate.ToShortDateString(),
loan.TimeReturned.ToShortDateString());
}
Le prêt ressemble à ceci :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.DataAnnotations;
namespace Library.Entities
{
public class Loan
{
[Key]
public int LoanId { get; set; }
[Required]
public DateTime? TimeOfLoan { get; set; }
public DateTime? DueDate { get; set; }
public DateTime? TimeReturned { get; set; }
[Required]
public Copy BookOnLoan { get; set; }
[Required]
public Member Loanee { get; set; }
}
}
Sur tous mes objets DateTime dans le setLoansView()
La méthode que j'obtiens 'ne contient pas de définition pour "ToShortString()".La classe Member a un ICollection<Loan>
et c'est de là que je récupère les prêts.Je n'arrive pas à comprendre pourquoi je perds l'accès aux méthodes de DateTime lorsque j'y accède depuis le ICollection
cependant.
La solution
C'est parce que le type de ces propriétés n'est pas DateTime
, mais Nullable<DateTime>
. Nullable<T>
n'expose pas une telle méthode.
Si vous êtes sûr que ces dates volonté avoir une valeur, s'interposer .Value
avant .ToShortDateString()
.Dans le cas contraire, vous devez décider de ce qui doit se passer dans ce cas.
Autres conseils
Tu as nullable
DateTime
objets.Vous devrez appeler .Value
pour obtenir la valeur (s'il y en a une)
loan.TimeOfLoan.Value.ToShortDateString()
C'est nullable, utilisez .Value
pour obtenir ces propriétés (vérifiez d'abord si null)
Parce que vos champs sont définis comme nullables DateTime?
Utilisez simplement .Value
pour accéder à la valeur du champ et vous devez disposer de vos méthodes de format DateTime normales.
Vous devriez également vérifier null en appelant .HasValue
vous avez un DateTime nullable (DateTime ?), seule la classe DateTime a la méthode "ToShortDateString()"...