如何创建可以转换为DateTime的类。但是,当它打包时,我需要投我的课。例如:
object date1 = new MyDateTime();
DateTime date2 = (DateTime)date1;
我需要直接这个工作示例。
我知道怎么做,但我的方式无需打包。我不确定是否有办法做到这一点。
请帮助。
PS。我需要直接将对象转换为DateTime。因此,MyDateTime必须先包装好。显式效果很好,但是如果你有打包对象则没有用。它必须使用像
这样的普通铸造来施放(DateTime) (object) MyDateTime
答案 0 :(得分:29)
你看起来是继承之后,能够将派生类实例“存储”在基类型的变量中,如下所示:
Stream s = new FileStream();
引擎盖下FileStream
的事实并没有丢失,只是因为你用Stream
护目镜指向它。
DateTime
是struct
,并且不支持struct
继承 - 因此 不 可能。
替代是user-defined conversions的explicit
关键字(语法看起来像一样)。这使您至少可以在课程和DateTime
之间进行更多的糖交换。
http://msdn.microsoft.com/en-us/library/xhbhezf4(v=vs.71).aspx
这可能看起来像:
class MyDateTime
{
private DateTime _inner;
public static explicit operator DateTime(MyDateTime mdt)
{
return mdt._inner;
}
}
您可以使用对应的implicit
关键字执行相同操作:
public static implicit operator DateTime(MyDateTime mdt)
{
return mdt._inner;
}
然后让你隐式地进行“施放”:
DateTime date = new MyDateTime();
另一个替代是使用您自己的内部使用DateTime
的适配器类封装DateTime
,然后从此类继承以创建MyDateTime
。然后,不要在代码库中使用DateTime
,而是使用此适配器类。
我在SmartDateTime
样式类中看到了类似的东西,其中DateTime
更好地理解了空值以及它是否已设置。
答案 1 :(得分:10)
您可以使用
class MyDateTime
{
public static explicit operator DateTime(MyDateTime dt)
{
return new DateTime(); // Convert dt here
}
}
答案 2 :(得分:1)
我会创建一个扩展方法来执行完成转换所需的步骤,而不是直接强制转换。某种转换是必要的,因为DateTime不能继承,所以直接转换是不可能的。
public static class DateTimeExtensions
{
public static MyDateTime ToMyDateTime(this DateTime dt)
{
//conversion logic
return myDataTime;
}
public static DateTime ToDateTime(this MyDateTime mdt)
{
//conversion logic
return dateTime;
}
}
通过这种方式,你可以像这样使用代码:
DateTime dt = mdt.ToDateTime();
或
MyDateTime mdt = dt.ToMyDateTime();
答案 3 :(得分:0)
您需要在MyDateTime类上编写一个显式的强制转换操作符,该操作符调用Datetime上的一个构造函数。 Here's an example