Вы можете использовать интерфейсы в определениях контрактов на обслуживание, если вы действительно хотите, если вы включаете известные типы, как вы делаете (с небольшой корректировкой, см. Ниже).
Очевидно, что использование интерфейса в качестве параметра универсального типа приводит к тому, что это слишком далеко для C # 3.0. Я изменил атрибут известного типа на
[ServiceKnownType(typeof(Batch<Command>))]
public interface IActions
{
}
Что заставляет это работать, в точку. Сериализация и десериализация сами по себе будут работать, но тогда вы столкнетесь с этим исключением:
Невозможно привести объект типа 'Batch`1 [Command]'.
набрать 'IBatch`1 [ICommand]'.
Для этого приведения в действие вам нужна языковая поддержка ковариации универсального типа, что было введено в C # 4.0. Чтобы это работало в C # 4.0, вам нужно добавить модификатор дисперсии:
public interface IBatch<out T>
{
}
Тогда это работает отлично ... к сожалению, вы не используете C # 4.0.
И еще одна вещь об использовании интерфейсов в контракте на обслуживание: если вы генерируете ссылку на обслуживание из них, он будет вводить все параметры интерфейса как object
, поскольку исходный тип интерфейса не является частью метаданных. Вы можете обмениваться контрактами через ссылку на сборку или вручную реорганизовать сгенерированный прокси-сервер для его исправления, но в целом использование интерфейсов с WCF, вероятно, доставляет больше хлопот, чем оно того стоит.