2012-04-12 71 views
11

我该如何制作课程,并将其转换为DateTime。但是当我打包时,我需要投我的课。例如:如何让C#中的类可以转换为DateTime?

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

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

我知道该怎么做,但我的方式将无包装工作。我不确定是否有办法做到这一点。

请帮忙。

PS。我需要直接将对象投射到DateTime。所以,MyDateTime必须先打包。显式运行良好,但如果您有打包对象,则无效。它让你看起来什么是为继承后,能够“存储”派生类实例的基本类型的,像这样的可变投只是用普通铸造像

(DateTime) (object) MyDateTime 
+0

如上所述,这是不可能的。你不能使用Convert.ToDateTime?为什么它需要成为一个“对象”变量? – Random832 2012-04-12 16:27:53

回答

29

Stream s = new FileStream(); 

在罩下的是FileStream这一事实并不会因为您在Stream护目镜上指向它而丢失。

DateTime是一个struct,并且不支持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对空值有更好的理解,并且它是否已设置。

+0

它不适用于这种情况 – 2012-04-12 10:21:10

+0

@EvgenyEkim然后,如果要将派生类型存储在基本类型的引用中,那么您正在寻找的是继承。这是'DateTime'不可能的,因为它是'struct'。 – 2012-04-12 10:23:21

+0

是的,你说得对。但我不知道是否有办法做到没有继承。 – 2012-04-12 10:30:36

10

你可以使用

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

你需要在一个调用的日期时间的建设者之一的MyDateTime类写一个显式类型转换操作符。Here's an example

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();