14

我怎样才能上课,可以转换为 DateTime。但是我需要在我的班级打包时进行。例如:

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

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

我知道怎么做,但我的方法不用打包也行。我不确定有没有办法做到这一点。

请帮忙。

PS。我需要直接将对象转换为 DateTime。因此,必须先打包 MyDateTime。显式效果很好,但如果你有打包的对象,它也无济于事。它必须使用普通的铸造来铸造,比如

(DateTime) (object) MyDateTime
4

4 回答 4

30

您似乎追求的是继承,能够将派生类实例“存储”在基类型的变量中,如下所示:

Stream s = new FileStream();

它是引擎盖下的事实FileStream并不会因为您Stream戴着护目镜指向它而丢失。

DateTimestruct, 并且struct不支持继承 - 所以这是不可能的。

另一种选择是用于用户定义转换explicit的关键字(在语法上看起来像强制转换)。这让你至少可以在你的班级和更多的糖之间进行交流。DateTime

这可能看起来像:

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,该类在内部使用 aDateTime然后从此类继承以创建MyDateTime. 然后DateTime,您可以使用这个适配器类,而不是在您的代码库中使用。

我在SmartDateTime样式类中看到过类似的事情,其中DateTime​​对空值以及是否已设置有更好的理解。

于 2012-04-12T10:18:50.683 回答
10

你可以使用

class MyDateTime
{
    public static explicit operator DateTime(MyDateTime dt)
    {
        return new DateTime(); // Convert dt here            
    }
}
于 2012-04-12T10:19:25.120 回答
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();
于 2015-04-08T02:24:46.990 回答
0

您需要在 MyDateTime 类上编写一个显式转换运算符,以调用 Datetime 上的构造函数之一。这是一个例子

于 2012-04-12T10:19:55.110 回答