2012-04-12 7 views
11

Jak utworzyć zajęcia, które można przesyłać do DateTime. Ale muszę rzucić moją klasę, kiedy się spakuje. Na przykład:Jak zrobić zajęcia w języku C#, które można przesyłać do DateTime?

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

Potrzebuję bezpośrednio tego działającego przykładu.

Wiem, jak to zrobić, ale moja droga będzie działać bez pakowania. Nie jestem pewien, czy istnieje sposób, aby to zrobić.

Proszę, pomóż.

PS. Potrzebuję rzucić bezpośrednio obiekt DateTime. Tak więc MyDateTime musi być wcześniej zapakowane. Wyraźny działa dobrze, ale nie pomaga, jeśli masz spakowany obiekt. I to trzeba rzucić tylko przy użyciu zwykłego odlewania jak

(DateTime) (object) MyDateTime 
+0

Jak opisano, jest to niemożliwe. Nie możesz użyć 'Convert.ToDateTime'? Dlaczego musi to być zmienna 'object'? – Random832

Odpowiedz

29

Co wydaje się być po to dziedziczenie, będąc w stanie „sklep” a pochodzi instancja klasy w zmiennej typu bazowego tak:

Stream s = new FileStream(); 

Fakt, że jest pod maską FileStream, nie został utracony tylko dlatego, że wskazuje się na niego przy pomocy gogli Stream.

DateTime jest struct i struct dziedziczenie nie jest obsługiwany - tak to nie możliwe.

Alternatywą jest explicit kluczowe dla user-defined conversions (składniowo patrząc jak odlewów). Pozwala to na co najmniej wymianę pomiędzy klasą a DateTime z większą ilością cukru.

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

To może wyglądać następująco:

class MyDateTime 
{ 
    private DateTime _inner; 

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

Można zrobić to samo z odpowiednikiem implicit słów kluczowych:

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

To wtedy pozwala wykonaj "odlew" niejawnie:

DateTime date = new MyDateTime(); 

Inną alternatywą: jest zapakowanie DateTime z własną klasą adaptera, która wewnętrznie używa DateTime, a następnie dziedziczy z tej klasy, aby utworzyć MyDateTime. Zamiast korzystać z DateTime w bazie kodu, należy użyć tej klasy adaptera.

Widziałem podobne rzeczy z klasami stylu SmartDateTime, gdzie DateTime ma lepsze zrozumienie wartości null i jeśli zostało ustawione.

+0

To nie działa w tej sytuacji –

+0

@EvgenyEkim To, czego szukasz, to dziedziczenie, jeśli chcesz zapisać typ wyprowadzony w referencji typu podstawowego. Nie jest to możliwe w przypadku 'DateTime', ponieważ jest to' struct'. –

+0

Tak, masz rację. Ale nie wiem, czy istnieje sposób, aby to zrobić bez dziedziczenia. –

10

Można użyć

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

trzeba by napisać jawnego operatora rzucony na swojej klasie MyDateTime że nazywa się jeden z konstruktorów na datetime.Here's an example.

1

Zamiast bezpośredniego rzutowania, utworzyłbym metodę rozszerzenia, która wykonuje wymagane kroki w celu ukończenia konwersji. Konieczna jest konwersja, ponieważ DateTime nie może zostać odziedziczony, więc bezpośrednie oddanie nie będzie możliwe.

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

W ten sposób, należy użyć kodu tak:

DateTime dt = mdt.ToDateTime(); 

lub

MyDateTime mdt = dt.ToMyDateTime(); 
Powiązane problemy