Tengo un tipo, llamémoslo Data<TKey>
. También tengo un contrato de servicio WCF que acepta un tipo (vamos a llamarlo Wrapper
) con una propiedad de tipo Object
(por razones que no entraré, esto no es opcional).¿Cómo especificar un tipo conocido de WCF en la configuración que es genérico?
[DataContract]
public class Data<TKey> { ... }
[DataContract]
public class Wrapper
{
[DataMember]
public object DataItem { get; set; }
}
En este momento estoy enviando dos clases IntData
y LongData
:
[DataContract]
public class IntData : Data<int> { /*empty*/ }
[DataContract]
public class LongData : Data<long> { /*empty*/ }
Ambos están configurados en los tipos conocidos fichero de configuración. La configuración se asemeja a algo así:
<configuration>
<system.runtime.serialization>
<dataContractSerializer>
<declaredTypes>
<add type="Wrapper, TheirAssembly">
<knownType type="IntData, MyAssembly"/>
<knownType type="LongData, MyAssembly"/>
</add>
</declaredTypes>
</dataContractSerializer>
</system.runtime.serialization>
</configuration>
En este punto, todo funciona bien.
Pero estoy a punto de agregar un tercer tipo y no me gusta tener las clases .NET vacías, innecesarias IntData
y LongData
. Solo existen porque ...
¡No sé cómo especificar tipos genéricos en la configuración de WCF!
Quiero hacer algo como esto, pero no conozco la sintaxis exacta.
<configuration>
<system.runtime.serialization>
<dataContractSerializer>
<declaredTypes>
<add type="Wrapper, TheirAssembly">
<!-- this syntax is wrong -->
<knownType type="Data{System.Int32}, MyAssembly"/>
<knownType type="Data{System.Int64}, MyAssembly"/>
</add>
</declaredTypes>
</dataContractSerializer>
</system.runtime.serialization>
</configuration>
¿Cuál es la sintaxis correcta para esto?
(Tenga en cuenta también que no puedo poner [KnownType(...)]
atributos en Wrapper
, ya que no es mi tipo. Config parece ser la única manera.)
EDITAR
@ respuesta de baretta funcionó muy bien. Sin embargo, nótese que en un principio he recibido este error:
Type 'MyAssembly.Data`1[System.Int64]' cannot be added to list of known types since another type 'MyAssembly.Data`1[System.Int32]' with the same data contract name ' http://www.mycompany.com/MyAssembly:Data ' is already present.
que no lo mencionó en la pregunta original, pero mi tipo tiene un nombre de contrato de datos explícita. Algo como esto:
[DataContract(Name = "Data")]
public class Data<TKey> { ... }
Se ha producido el error anterior hasta que me quita el valor Name
propiedad del atributo. Espero que también ayude a alguien más. No sé qué formato funciona en este escenario. Estos no:
[DataContract(Name = "Data\`1")]
[DataContract(Name = "Data{TKey}")]
¿Alguien sabe cómo hacer esto?
EDITAR 2
Gracias de nuevo a @baretta quien señaló que la sintaxis correcta es, de hecho:
[DataContract(Name = "Data{0}")]
Sí, lo sé! :) Edité mi respuesta – baretta