2014-10-24 4 views
-3

У меня вопрос о лучших практиках. У меня есть метод BuildTourTime, который принимает DateTime и строку, которая представляет время.Статический или экземпляр C#

internal DateTime BuildDateTime(DateTime date, string time) 
    { 
     return date.Add(TimeSpan.Parse(time)); 

    } 

Я буду использовать это в нескольких местах. В настоящее время он используется в другом классе

private IEnumerable<Tour> BuildTours(Response Data) 
     { 
      //Tour tour = new Tour(); 
      List<Tour> tours = new List<Tour>(); 
      foreach(Events ivEvents in Data.response.events) 
      { 
       bool isCancelled = true; //Replace this with logic 
       tours.Add(new Tour(ivEvents.Id,Data.response.ID,Data.response.Title,BuildDateTime(ivEvents.Date,ivEvent.Start),isCancelled,ivEvents.Quantity-ivEvents.Remaining).); 
      } 
      return tours; 
     } 

В настоящее время у меня есть класс Tour без конструктора без параметров. Насколько я могу судить, у меня есть несколько вариантов. Объявите статичность BuildDateTime. Или добавьте конструктор без параметров для Tour. Или создайте класс-помощник и поставьте BuildDateTime. Это хорошее место для использования статического метода? Это то, к чему я склоняюсь.

Редактировать: Почему downvotes? Ссылка, опубликованная (которую я прочитал до публикации этого вопроса), не отвечает на мой вопрос. Мой вопрос показывает, что я изучил варианты, которые мог бы использовать, и я задал точный вопрос, а также предоставил относительный код.

+0

да, если это необходимо для использования во многих местах сделать статический метод и сделать статический вспомогательный класс –

+2

См http://stackoverflow.com/questions/241339/when-to-use-static-classes-in -c-sharp – ebb

+1

Метод кажется идеальным для метода расширения для типа даты и времени – Steve

ответ

4

Вы можете сделать метод расширения:

internal static class DateTimeExtension 
{ 
    internal static DateTime BuildDateTime(this DateTime date, string time) 
    { 
     return date.Add(TimeSpan.Parse(time)); 
    } 
} 

и использовать его:

string time = ... 
DateTime date = ... 
date.BuildDateTime(time); 
+0

+1, метод расширения имеет смысл, насколько простым является метод. Вероятно, я бы назвал это .AddTime вместо BuildDateTime, хотя бы о чем подумать. – fooser

+0

Мне это нравится. Это слишком много, если он будет использоваться только в одном проекте? Несколько мест в 1 проекте –

+0

@fooser вы правы с именем метода;) –

2

Ваш метод, кажется, не быть специфическими для данного класса, но может быть использовать в общем на каждые другие классы. Казалось бы, идеальный пример метода расширения для структуры DateTime

public static class MyDateExtensions 
{ 
    public static DateTime BuildDateTime(this DateTime date, string time) 
    { 
     return date.Add(TimeSpan.Parse(time)); 

    } 
} 

таким образом вы могли бы назвать его отовсюду (при условии добавления с использованием пространства имен)

// Addin a day plus one hour 
DateTime newDate = DateTime.Now.BuildDateTime("01:01:00:00"); 

Сказал, что его кажется немного преувеличено, чтобы использовать этот подход, когда DateTime.Add только одна строки коды и без каких-либо сложностей, чтобы скрыть

DateTime newDate = DateTime.Now.Add(TimeSpan.Parse("01:01:00:00")); 

Выбор для метода расширения Shou ld предпочтительнее, если вы не уверены в вводах, которые получает синтаксический анализ. Например, это может быть более безопасный метод, но многое зависит от того, что вы хотите, если строка времени неверна. Многие люди предпочитают получать исключение, если строка времени недействительна, а не предотвращает исключение и возвращает предопределенный результат.

public static DateTime BuildDateTime(this DateTime date, string time) 
{ 
    if(string.IsNullOrWhiteSpace(time)) 
     return date; 

    TimeSpan ts; 
    if(TimeSpan.TryParse(time, out ts)) 
     return date.Add(ts); 
    else 
     return date; 
} 
+0

Аргумент 'time' - это' TimeSpan', а не 'DateTime'. Образец вызова требует редактирования. –

+0

@KeithPayne да отмечен и исправлен, пока вы добавили комментарий – Steve

+0

@Steve Спасибо за помощь в этом. Хотел бы я отметить два вопроса правильно. Думаю, я получил первое. –