Вопрос

Я не могу реализовать этот сценарий.Вот образец-

[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[]'».

Это было полезно?

Решение

Если у вас есть определение объекта BaseT, помеченное как KnownType, и вы указали там ChildT, оно будет нормально работать с абстрактной базой (я делаю это постоянно).Ваша проблема в том, что ковариация массива не разрешена в C#, поэтому вы не можете привести BaseT[] к ChildT[].Однако приведение отдельных элементов к ChildT будет работать — вы можете увидеть это, если проверите массив в отладчике — если вам нужен ChildT[], пусть LINQ сделает всю работу за вас (например, baseArray.Cast().ToArray() ).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top