如何在C#中创建类,可以转换为DateTime?

时间:2012-04-12 10:16:10

标签: c# datetime packing

如何创建可以转换为DateTime的类。但是,当它打包时,我需要投我的课。例如:

object date1 = new MyDateTime();
DateTime date2 = (DateTime)date1;

我需要直接这个工作示例。

我知道怎么做,但我的方式无需打包。我不确定是否有办法做到这一点。

请帮助。

PS。我需要直接将对象转换为DateTime。因此,MyDateTime必须先包装好。显式效果很好,但是如果你有打包对象则没有用。它必须使用像

这样的普通铸造来施放
(DateTime) (object) MyDateTime

4 个答案:

答案 0 :(得分:29)

你看起来是继承之后,能够将派生类实例“存储”在基类型的变量中,如下所示:

Stream s = new FileStream();

引擎盖下FileStream的事实并没有丢失,只是因为你用Stream护目镜指向它。

DateTimestruct,并且不支持struct继承 - 因此 可能。

替代user-defined conversionsexplicit关键字(语法看起来像一样)。这使您至少可以在课程和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