Estoy tratando de implementar un contrato de servicio que contiene un método que toma una interfaz genérica, y esa interfaz genérica en sí tiene un parámetro de interfaz. Me he decorado la interfaz de servicio con ServiceKnownType, he decorado con la implementación del servicio KnownType regular, y he decorado la aplicación DataContract con KnownType normal:WCF: ¿Es posible la serialización de interfaces genéricas?
[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(ICallbacks))]
[ServiceKnownType(typeof(Batch<object>))]
[ServiceKnownType(typeof(Command))]
public interface IActions
{
[OperationContract]
IResponse TakeAction(IBatch<ICommand> commands);
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Reentrant)]
[KnownType(typeof(Batch<object>))]
[KnownType(typeof(Command))]
internal class Actions : IActions
{
}
[DataContract]
[KnownType(typeof(Command))]
public class Batch<T> : IBatch<T>
{
}
Para el registro, no tengo por lotes, ya que parece que solo puede expresar un tipo de conocimiento para un tipo genérico una vez: parece emitir BatchOfanyType, pero no estoy seguro de cómo manejarlo.
La excepción que obtengo es "Agregue cualquier tipo no conocido estáticamente a la lista de tipos conocidos, por ejemplo, utilizando el atributo KnownTypeAttribute o agregándolos a la lista de tipos conocidos pasados a DataContractSerializer".
¿Hay algo obvio que estoy haciendo mal? ¿Las interfaces genéricas de las interfaces simplemente no son compatibles? Para el registro estoy en C# 2.0 y .NET 3.0 para este proyecto.
Sí, edité en la plataforma que estoy usando cuando pensé en la covarianza en C# 4.0. Oh, para actualizar. – bwerks