2013-11-18 4 views
1

Ive нашел несколько примеров этой проблемы на других языках, таких как ruby ​​или php, и они, похоже, указывают, что мне нужно будет что-то сделать of include, чтобы поддержать это, но я не могу точно понять это.Почему я не могу вызвать метод DateTime для объекта DateTime в другом классе в C#

у меня есть:

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

займа выглядит следующим образом:

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

На всех моих объектов DateTime в методе setLoansView() я получаю «не содержит определения для "ToShortString()". Класс участника имеет ICollection<Loan>, и именно там я получаю кредиты. Я не могу понять, почему я теряю доступ к методам DateTime, когда я обращаюсь к ним с ICollection.

ответ

6

Это потому, что тип этих свойств не является DateTime, но Nullable<DateTime>. Nullable<T> не раскрывает такой метод.

Если вы уверены, что эти даты будет, введите значение, вставьте .Value до .ToShortDateString(). Если нет, вы должны решить, что должно произойти в этом случае.

+0

Совершенного спасибо. Таким образом, в 100% случаев все мои поля DateTime будут иметь значение, кроме 'DateTime TimeReturned'. Есть ли чистый и эффективный способ проверить, что в методе Add()? или мне нужно будет проверить с hasValue сначала перед Add()? –

+0

@ChrisShields: способы проверки - это обычные условные выражения: 'if' и условный оператор'?: '. Это зависит от того, что вы хотите, если нет значения, например. 'loan.TimeReturned.HasValue? loan.TimeReturned.ToShortDateString: "n/a" '. – Jon

+0

еще раз спасибо. Я пробовал иметь инструкцию if в качестве одного из аргументов, но не мог правильно получить синтаксис. Тем не менее, оператор, как вы предлагали, работает отлично. Я все еще пытаюсь привыкнуть к их использованию :) –

1

У вас есть nullableDateTime объектов. Вам нужно будет позвонить .Value, чтобы получить значение (если есть один)

loan.TimeOfLoan.Value.ToShortDateString() 
1

Это обнуляемое, используйте .Value, чтобы получить эти свойства (проверьте, если нуль первого)

1

Поскольку ваши поля определяются как обнуляемые DateTime?

Просто используйте .Value для доступа к значению поля и у вас должны быть обычные методы формата DateTime.

Также следует проверить на нуль по телефону .HasValue

+0

Спасибо за отзыв на HasValue :) –

0

у вас есть обнуляемый DateTime (DateTime?), Только класс DateTime имеет "ToShortDateString) (" метод ...