如何在C#中创建一个类,使其可以转换为DateTime类型?

14

我该如何创建一个类,使其可以转换为 DateTime 类型。但是我需要在打包时进行类型转换。例如:

object date1 = new MyDateTime();
DateTime date2 = (DateTime)date1;
我需要一个能直接运行的示例。 我知道如何做,但我的方法将不使用打包。我不确定是否有方法可以做到这一点。 请帮忙。 附注:我需要直接将对象强制转换为DateTime。因此,MyDateTime在打包之前必须被打包。显式方法很好用,但如果您有已经打包的对象,它就没用了。它必须使用普通转换进行转换,例如
(DateTime) (object) MyDateTime

如描述的那样,这是不可能的。你不能使用 Convert.ToDateTime 吗?为什么需要一个 object 变量? - Random832
4个回答

31

你似乎需要继承,能够像这样将派生类实例“存储”在基础类型的变量中:

Stream s = new FileStream();

即使你戴着 Stream 的眼镜,它的内部仍然是一个 FileStream

DateTime 是一种 struct,不支持 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,内部使用DateTime,然后从这个类继承来创建MyDateTime。然后在您的代码库中,不要使用DateTime,而是使用这个适配器类。

我曾经看到过类似的SmartDateTime风格的类,其中DateTime对null值和是否已设置有更好的理解。


@EvgenyEkim 如果你想要将派生类型存储在基类型的引用中,那么你需要使用继承。但是由于DateTime是一个结构体,所以这是不可能的。 - Adam Houldsworth
是的,你说得对。但我不知道是否有不使用继承的方法来实现它。 - Evgeny Ekim
@EvgenyEkim 你可以在自己的类中存储 DateTime,但是你不能将自己的类存储在 DateTime 中。我已经演示了前者。 - Adam Houldsworth
抱歉,我没有阅读所有的答案。非常感谢您的回答。 - Evgeny Ekim

10

你可以使用

class MyDateTime
{
    public static explicit operator DateTime(MyDateTime dt)
    {
        return new DateTime(); // Convert dt here            
    }
}

2

不要直接进行强制类型转换,可以创建一个扩展方法来执行所需的步骤完成转换。由于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();

0

你需要在 MyDateTime 类上编写一个显式转换运算符,该运算符调用 Datetime 上的一个构造函数。这里有一个例子


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接