質問

私は、このシナリオの仕事をすることはできません。ここではパターンがあります -

[DataContract]
/*abstract*/ class BaseT
{ ... }

[DataContract]
class ChildT : BaseT
{ ... }

[DataContract]
class MessageContents
{
    [DataMember]
    public BaseT[] XX; // Array of BaseT objects. I need WCF to somehow figure out that they're actually ChildT.
}

// ...receive a webHttp request of type MessageContents...

// cast to use MessageContents.XX as a ChildT[] instead of a BaseT[]
ConcreteClass[] QQ = (ConcreteClass[])request.xx;

私は無駄にKnownTypeまたはKnownServiceTypeと実質的にすべてのものに注釈を付ける試みた。

私はBaseTのは抽象的にする場合は、

、私は「インスタンス抽象クラスをすることはできません」直列化復元エラーが発生します。私はBaseTのコンクリートを作る場合、私は、直列化復元エラーを得ることはありません。私はChildTにキャストするために行くときに代わりに、私は「『BaseTのは[]』 『ChildT []』を入力するタイプのオブジェクトをキャストすることができない」取得しています。

役に立ちましたか?

解決

あなたはKnownTypeとリストがChildTでタグ付けBaseTのオブジェクトの定義を持っている場合、それは抽象ベース(私はこのすべての時間を行う)で正常に動作します。あなたの問題は、C#で許可されていないこと、配列の共分散であるので、あなたは[] ChildTにBaseTの[]にキャストすることはできません。あなたはdebugger-で配列を検査した場合、あなたがChildTが必要な場合は、[])例えば、baseArray.Cast()。てToArray((LINQがあなたのために仕事をさせ、これを見ることができますthough-、ChildTに個々の要素をキャストに動作します)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top