14

DateTime にキャストできるクラスを作成するにはどうすればよいですか。しかし、クラスがパックされたときにクラスをキャストする必要があります。例えば:

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

この実際の例が直接必要です。

私はそれを行う方法を知っていますが、私の方法はパッキングなしで機能します。それを行う方法があるかどうかはわかりません。

助けてください。

PS。オブジェクトを直接 DateTime にキャストする必要があります。したがって、 MyDateTime は前にパックする必要があります。Explicit はうまく機能しますが、オブジェクトがパックされている場合は役に立ちません。そして、次のような通常のキャストを使用してキャストする必要があります

(DateTime) (object) MyDateTime
4

4 に答える 4

30

後に見えるのは継承であり、次のように派生クラスのインスタンスを基本型の変数に「格納」できます。

Stream s = new FileStream();

ゴーグルをつけてFileStream指しているからといって、ボンネットの下にあるという事実が失われることはありません。Stream

DateTimeでありstructstruct継承はサポートされていないため、これは不可能です。

代替手段は、ユーザー定義の変換explicitのキーワードです(構文的にはキャストのように見えます)。これにより、少なくともクラス間でより多くの砂糖を交換することができます.DateTime

これは次のようになります。

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

もう 1 つの方法DateTimeは、内部で を使用する独自のアダプタ クラスでラップしDateTime、このクラスから継承して を作成することMyDateTimeです。次に、コード ベースで使用する代わりに、DateTimeこのアダプター クラスを使用します。

ヌルをよりよく理解し、それが設定されている場合、SmartDateTimeスタイルクラスで同様のことを見てきました。DateTime

于 2012-04-12T10:18:50.683 に答える
10

あなたが使用することができます

class MyDateTime
{
    public static explicit operator DateTime(MyDateTime dt)
    {
        return new DateTime(); // Convert dt here            
    }
}
于 2012-04-12T10:19:25.120 に答える
0

Datetime のコンストラクターの 1 つを呼び出す明示的なキャスト演算子を MyDateTime クラスに記述する必要があります。ここに例があります。

于 2012-04-12T10:19:55.110 に答える