2012-04-12 28 views
11

Làm cách nào để tạo lớp, có thể truyền tới DateTime. Nhưng tôi cần phải bỏ lớp của tôi, khi nó đóng gói. Ví dụ:Làm thế nào để tạo lớp trong C#, có thể được đưa vào DateTime?

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

Tôi cần trực tiếp ví dụ làm việc này.

Tôi biết cách thực hiện, nhưng cách của tôi sẽ hoạt động mà không cần đóng gói. Tôi không chắc chắn có cách nào để làm điều đó.

Xin vui lòng, trợ giúp.

PS. Tôi cần phải cast đối tượng trực tiếp vào DateTime. Vì vậy, MyDateTime phải được đóng gói trước. Rõ ràng hoạt động tốt, nhưng nó không giúp đỡ nếu bạn có đối tượng đóng gói. Và nó phải bỏ chỉ sử dụng đúc bình thường như

(DateTime) (object) MyDateTime 
+0

Như đã trình bày, điều này là không thể. Bạn không thể sử dụng 'Convert.ToDateTime'? Tại sao nó cần phải là biến 'object'? – Random832

Trả lời

29

gì bạn dường như sau khi là thừa kế, có khả năng "cửa hàng" một lớp dụ có nguồn gốc trong một biến kiểu cơ sở như vậy:

Stream s = new FileStream(); 

Thực tế rằng nó là một FileStream dưới mui xe không bị mất chỉ vì bạn đang trỏ đến nó với kính bảo hộ Stream bật.

DateTime là một struct, và struct thừa kế không được hỗ trợ - vì vậy đây là không càng tốt.

Một thay thế là từ khóa explicit cho user-defined conversions (cú pháp tìm như phôi). Điều này cho phép bạn ít nhất trao đổi giữa lớp học của bạn và DateTime với nhiều đường hơn.

http://msdn.microsoft.com/en-us/library/xhbhezf4(v=vs.71).aspx

Điều này có thể trông giống như:

class MyDateTime 
{ 
    private DateTime _inner; 

    public static explicit operator DateTime(MyDateTime mdt) 
    { 
     return mdt._inner; 
    } 
} 

Bạn có thể làm tương tự với các đối tác implicit keyword:

public static implicit operator DateTime(MyDateTime mdt) 
{ 
    return mdt._inner; 
} 

đó sau đó cho phép bạn làm như "đúc" ngầm:

DateTime date = new MyDateTime(); 

Một cách khác là để bọc DateTime với lớp bộ điều hợp của riêng bạn sử dụng nội bộ DateTime và sau đó kế thừa từ lớp này để tạo MyDateTime. Sau đó, thay vì sử dụng DateTime trong cơ sở mã của bạn, bạn sử dụng lớp bộ điều hợp này.

Tôi đã nhìn thấy những điều tương tự với các lớp kiểu SmartDateTime trong đó DateTime hiểu rõ hơn về các giá trị rỗng và nếu được đặt.

+0

Nó không hoạt động cho tình huống này –

+0

@EvgenyEkim Những gì bạn đang tìm kiếm là thừa kế sau đó, nếu bạn muốn lưu trữ một loại có nguồn gốc trong một tham chiếu của một loại cơ sở. Điều này là không thể với 'DateTime' vì nó là một' struct'. –

+0

Vâng, bạn nói đúng. Nhưng tôi không biết là có cách nào để làm điều đó mà không thừa kế. –

10

Bạn có thể sử dụng

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

Bạn sẽ cần phải viết một nhà điều hành chuyển kiểu tường minh trên lớp MyDateTime của bạn mà các cuộc gọi thành một trong những nhà xây dựng trên Datetime.Here's an example.

1

Thay vì truyền trực tiếp, tôi sẽ tạo phương thức tiện ích mở rộng thực hiện các bước bắt buộc để hoàn tất chuyển đổi. Một số loại chuyển đổi là cần thiết, bởi vì DateTime không thể được kế thừa từ, do đó, một diễn viên trực tiếp sẽ là không thể.

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; 
    } 
} 

Bằng cách này, bạn sẽ sử dụng các mã như vậy:

DateTime dt = mdt.ToDateTime(); 

hoặc

MyDateTime mdt = dt.ToMyDateTime(); 
Các vấn đề liên quan