我有一个最佳实践问题。
我有一个方法BuildTourTime
,它接受一个DateTime和一个表示时间的字符串。
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。这是使用静态方法的好地方吗?这就是我倾向于的。
编辑:为何选票?发布的链接(我在发布此问题之前阅读)并未回答我的问题。我的问题表明,我已经调查了我可以使用的选项,我已经提出了一个确切的问题,并提供了相关的代码。
答案 0 :(得分: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);
答案 1 :(得分: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"));
如果您不确定解析接收的输入,则应首选选择扩展方法。例如,这可能是一种更安全的方法,但如果时间字符串无效,则很大程度上取决于您希望发生什么。如果时间字符串无效,许多人更喜欢获得异常,而不是阻止异常并返回预定义的结果。
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;
}