5

私には2つのタイプがあります:BaseQuestionQuestionQuestionからいくつかのプロパティを継承しますBaseQuestion。これで、WebAPIを作成してBaseQuestion利用できるようになりました。データ型には、Question利用可能にしたくない追加のプロパティがあります。を取得するメソッドがQuestionあり、最初の計画は暗黙的にそれをにアップキャストすることでしたBaseQuestion。アクセス可能にしたくない余分なプロパティはすべて失われ、返却できると思いました。まあ、そうではありません。これが私がすることです:

Question q = allQuestions[0];
BaseQuestion bq = q;
string type = bq.GetType().ToString();

bqのタイプはまだ「質問」です。BaseQuestionプロパティにアクセスできませんが、デバッガーでそれらを確認でき、クライアントに送信するJSON出力にあります。

bqをタイプBaseQuestionにし、サブクラスで定義されているプロパティを持たないようにする方法についてのアイデアはありますか?

4

2 に答える 2

11

型キャストはオブジェクトの性質を変更せず、オブジェクトのビューを変更するだけです。基本型に型キャストすると、実際のオブジェクトで他に定義されているものに関係なく、基本型で定義されたメンバーのみを表示できるフィルターを介してオブジェクトが表示されます。

Webサービス呼び出しからオブジェクトを返す場合、シリアル化されてネットワークを介して返送されるのは実際のオブジェクトであり、そのすべてのシリアル化可能なメンバーです。

派生したQuestionクラスのメンバーがAPI呼び出し元に戻されないようにするために使用できる手法の1つは、Questionクラスで宣言されたメンバーのシリアル化を抑制することです。.NETにはいくつかのシリアル化サブシステムがありますが、XmlSerializationを使用している場合は、Questionクラスで宣言されたメンバーを[XmlIgnore]属性で装飾して、XmlSerializationによってシリアル化されないようにします。別のシリアル化サブシステムを使用している場合は、そのシステムでこれに類似していることを理解する必要があります。

もう1つの可能性は、WebAPIサービスのインターフェースコントラクトを定義することです。BaseQuestionクラスとQuestionクラスは、これらのコントラクトインターフェイスの1つ以上を実装します。これにより、実際のオブジェクトが何であるかに関係なく、シリアル化がコントラクトインターフェイスで定義されたプロパティのみに制限されると思います。

他のすべてが失敗した場合、力ずくの解決策は、一時変数でBaseQuestionのインスタンスを構築し、関連するプロパティを実際の質問オブジェクトから一時オブジェクトにコピーして、一時オブジェクトを返すことです。これは失礼で粗雑であり、より良い方法が必要ですが、それは機能します。

于 2012-08-24T02:47:54.433 に答える
1

型キャストは、オブジェクト自体ではなく、オブジェクトへの参照のタイプのみを変更します。

.GetType()のインスタンスを呼び出すと、それを参照する変数の型に関係なく、Question常に型が返されます。Question

基本タイプが必要な場合は.BaseType、タイプのプロパティを呼び出す必要があります。

だから、このようなもの:

string type = q.GetType().BaseType.ToString();
于 2012-08-24T03:20:11.667 に答える