1

このシナリオを機能させることはできません。これがパターンです-

[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[]'にキャストできなくなります。

4

1 に答える 1

1

KnownType でタグ付けされた BaseT オブジェクト定義があり、そこに ChildT がリストされている場合、抽象ベースで正常に機能します (私は常にこれを行っています)。問題は、C# では配列共分散が許可されていないため、BaseT[] を ChildT[] にキャストできないことです。ただし、個々の要素を ChildT にキャストすることはできますが、デバッガーで配列を調べればわかります。ChildT[] が必要な場合は、LINQ に任せてください (例: baseArray.Cast().ToArray())。 )。

于 2009-11-11T01:09:22.170 に答える