我们正在编写一个可供其他团队访问的dll。 我们的一个要求是每个传递的DateTime都有一个DateTimeKind.Utc。
但是,我们没有强制执行导致错误的此要求。所以我们想知道我们如何强制执行。
我们有一些想法:
编写一个方面来检查传递给方法的每个参数。 Kind!= UTC时抛出异常。当您传递包含DateTime的对象时,这可以工作但不起作用。
使用自定义对象UtcDateTime更改所有DateTimes。
这可能有效,但需要确保我们将每个DateTime和所有调用替换为我们的日期时间。看起来像这样:
public class UtcDateTime
{
private DateTime _dateTime;
public UtcDateTime(DateTime dateTime)
{
if(dateTime.Kind != DateTimeKind.Utc)
{
throw new ArgumentException();
}
_dateTime = dateTime;
}
}
有更好的方法吗?
答案 0 :(得分:3)
使用自定义对象UtcDateTime更改所有DateTimes。
如果你想这样做并用其他内容替换DateTime
,你也可以使用DateTimeOffset
,其中包括时区信息。
答案 1 :(得分:1)
您可以使用代码合同来强制执行此操作。
在这里阅读它们。
http://msdn.microsoft.com/en-us/library/dd264808(v=vs.110).aspx
例如,您可以使用
Contract.Requires(yourDateTime.Kind == DateTime.Utc);
或者,您可以在方法中强制执行转换。如果是DateTimeKind.Unspecified
,请抛出。
void Foo(ObjectWithDateTime foo)
{
if (foo.Date.Kind == DateTimeKind.Unspecified) {
throw ....
}
// convert here.
}