0

ClassAとCLassBの2つのクラスがあります。ClassAは抽象クラスです。ClassBはClassAから派生しています。ParentDTOという名前のDTOが1つあります。

public class ParentDTO
{
    public int UserId { get; set; }
}

public abstract class ClassA
{
    public abstract void CreateUser(ParentDTO dto);
}

public class ClassB : ClassA
{
    public override void CreateUser(ParentDTO dto)
    {
        Console.WriteLine("You are in class ClassB");
    }
}

これで、ParentDTOから派生した1つのDTO(MyDTO)ができました。

public class MyDTO: ParentDTO
{
    public int MyID { get; set; }
}

ClassBをさらに拡張しました:

public class ClassC : ClassB
{
    public override void CreateUser(ParentDTO dto)
    {
        var mydto = (MyDTO) dto;// This throws cast exception
        mydto.MyID=222;
    }
}

私は上記のコードを次のように使用しています:

    ClassC c = new ClassC();
    ParentDTO dto=new ParentDTO();
    c.CreateUser(dto);

ClassCのCreateUserメソッドで上記のDTOをキャストする方法を教えてもらえますか?コードでmydto.MyIDを使用したい。私はLiontoAnimalではなくAnimaltoLionをキャストするようなことをしていることを知っています。しかし、子DTO IDを使用する方法はありますか?誰かが私が間違っていることを教えてもらえますか?

4

5 に答える 5

1

インターフェイス アーキテクチャを間違った方法で使用しているだけです。ParentDTO クラスに get、set を追加。

于 2012-08-31T13:16:04.790 に答える
0

子型 (または子型から派生した別の型) として初期化されていない限り、親型変数を子型にキャストすることはできません。

ClassC c = new ClassC();
ParentDTO dto = new MyDTO();
c.CreateUser(dto);
于 2012-08-31T13:04:15.307 に答える
0

クラス のインスタンスを作成しましたParentDTO。インスタンスは実際には typeであり、 type ではないため、MyDTO正しくキャストすると、この例外が発生します。 そこにあるオブジェクトインスタンスには name のプロパティがありません。単に存在しないため、存在しない値を取得する方法はありません。ParentDTOMyDTO
MyID

達成しようとしていることを説明する必要があるかもしれません。

于 2012-08-31T13:06:45.417 に答える
0

他の答えは正しいですが、「静的型」と「実行時型」の違いをよりよく理解することで、この動作の理由がより明確になります。静的型は C# コード内の変数の型であり、実行時型はメモリ内の実際のオブジェクトの型です。

静的な型と実行時の型が異なる場合があることは誰もが知っています。検討:

class A { }
class B : A { }

A a = new B();

変数aは type のインスタンスを参照しますB。変数の静的型は ですがA、オブジェクトの実行時型は ですB

型 B のインスタンスを参照する型 Aaの参照を保持していると考えることもできます。これは、タイプ B がタイプ A から派生した (または等しい) 場合にのみ許可されます。

したがって、以下は許可されません。

B b = new A();

ここでは、型 A (実行時型) のインスタンスへの参照を (静的) 型 B の変数に代入しようとしています。同様に、次の割り当ては許可されていません。

string s = new object();
MyDTO dto = new ParentDTO();

キャスト演算子は物事をやや複雑にしますが、根本的な問題は同じです:実行時の型が参照の静的型から派生していないか等しくないオブジェクトを指すように参照を設定しようとしています:

A a1 = new A();
B b1 = new B();

A a2 = (A)b1;  // fine, because B is derived from A
B b2 = (B)a1;  // not allowed, because A is not derived from B.

繰り返しますが、と を置き換えると、これはより理にかなっている可能性がありobjectます。AstringB

object a1 = new object();
string b1 = "Hello, World!";

object a2 = (object)b1;  // a2 now points to the string "Hello, World!";
string b2 = (string)a1;  // cast fails: the string variable can't point to an instance of `object`

同様に、あなたのタイプで:

ParentDTO a1 = new ParentDTO();
MyDTO     b1 = new MyDTO();

ParentDTO a2 = (ParentDTO)b1;  // works
MyDTO     b2 = (MyDTO)a1;;     // doesn't
于 2012-08-31T14:02:24.697 に答える
0

ClassCのCreateUserメソッドで上記のDTOをキャストする方法を教えてください。

とんでもない。宣言で基本型を使用して、基本型のオブジェクトを作成しました。派生型にキャストすることはできません。違法です。使用する

ParentDTO dto=new MyDto();

これを読む

于 2012-08-31T13:12:22.310 に答える