Как сделать класс в С#, который можно применить к DateTime?

Как я могу создать класс, который можно применить к DateTime. Но мне нужно бросить свой класс, когда он упакован. Например:

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

Мне нужен непосредственно этот рабочий пример.

Я знаю, как это сделать, но мой путь будет работать без упаковки. Я не уверен, есть ли способ сделать это.

Пожалуйста, помогите.

PS. Мне нужно напрямую передать объект DateTime. Итак, MyDateTime нужно упаковать раньше. Явные работы хорошо, но это не помогает, если у вас есть упакованный объект. И он должен использовать только обычное кастинг, например

(DateTime) (object) MyDateTime

Ответ 1

Похоже, что после этого есть наследование, способное "хранить" экземпляр производного класса в переменной базового типа следующим образом:

Stream s = new FileStream();

Тот факт, что это FileStream под капотом, не потерян только потому, что вы указываете на него с помощью Stream очков.

DateTime является struct, а наследование struct не поддерживается - так что это не.

Альтернативный - это ключевое слово explicit для пользовательских конверсий (синтаксически похожее на приведение). Это позволяет вам, по крайней мере, обмениваться между вашим классом и 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 имеет лучшее понимание нулей и если оно было установлено.

Ответ 2

Вы можете использовать

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

Ответ 3

Вместо прямого трансляции я создам метод расширения, который выполнит необходимые шаги для завершения преобразования. Необходимо какое-то преобразование, потому что 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();

Ответ 4

Вам нужно будет написать явный оператор приведения в класс MyDateTime, который вызывает один из конструкторов в Datetime. Вот пример.