Ho un tipo, chiamiamolo Data<TKey>
. Ho anche un contratto di servizio WCF che accetta un tipo (chiamiamolo Wrapper
) con una proprietà di tipo Object
(per motivi per cui non entrerò, questo non è facoltativo).Come specificare un tipo noto di WCF in configurazione generica?
[DataContract]
public class Data<TKey> { ... }
[DataContract]
public class Wrapper
{
[DataMember]
public object DataItem { get; set; }
}
In questo momento mi sto inviando due classi IntData
e LongData
:
[DataContract]
public class IntData : Data<int> { /*empty*/ }
[DataContract]
public class LongData : Data<long> { /*empty*/ }
Sono entrambi configurati in tipi noti file di configurazione. La configurazione è simile a questa:
<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>
A questo punto, tutto funziona correttamente.
Ma sto per aggiungere un terzo tipo e non mi piace avere le classi .NET non necessarie e vuote IntData
e LongData
. Esistono solo perché ...
Non so come specificare i tipi generici nella configurazione di WCF!
Voglio fare qualcosa di simile, ma non conosco la sintassi esatta.
<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>
Qual è la sintassi corretta per questo?
(Si noti anche che non posso mettere [KnownType(...)]
attributi su Wrapper
in quanto non è il mio tipo. Config sembra essere l'unico modo.)
EDIT
@ risposta di Baretta lavorato bene. Si noti, tuttavia, che inizialmente ho ricevuto questo errore:
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.
non ho menzionato nella domanda iniziale, ma il mio tipo ha un nome esplicito contratto di dati. Qualcosa di simile:
[DataContract(Name = "Data")]
public class Data<TKey> { ... }
è verificato l'errore sopra finché ho rimosso il valore Name
struttura dall'attributo. Spero che aiuti anche qualcun altro. Non so quale formato funzioni in questo scenario. Non ce n'erano:
[DataContract(Name = "Data\`1")]
[DataContract(Name = "Data{TKey}")]
Qualcuno sa come fare?
EDIT 2
Grazie ancora a @baretta che ha sottolineato che la sintassi corretta è in realtà:
[DataContract(Name = "Data{0}")]
Sì, lo so! :) Ho modificato la mia risposta – baretta