Как сделать класс в С#, который можно применить к 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. Вот пример.