Mam typ, nazwijmy go Data<TKey>
. Mam również umowę o świadczenie usług WCF, która akceptuje typ (można nazwać to Wrapper
) z właściwością typu Object
(z powodów, do których nie będę się stosować, nie jest to opcjonalne).Jak określić typ WCF znany w konfiguracji, który jest ogólny?
[DataContract]
public class Data<TKey> { ... }
[DataContract]
public class Wrapper
{
[DataMember]
public object DataItem { get; set; }
}
Teraz wyślę dwie klasy IntData
i LongData
:
[DataContract]
public class IntData : Data<int> { /*empty*/ }
[DataContract]
public class LongData : Data<long> { /*empty*/ }
Oni obaj skonfigurowane w znanych typów pliku konfiguracyjnego. Konfiguracja przypomina coś podobnego:
<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>
W tym momencie wszystko działa poprawnie.
Ale mam zamiar dodać trzeci typ i nie lubię niepotrzebnych, pustych klas .NET IntData
i LongData
. Istnieją tylko dlatego, że ...
Nie wiem, jak określić typy ogólne w konfiguracji WCF!
Chcę zrobić coś takiego, ale nie znam dokładnej składni.
<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>
Jaka jest prawidłowa składnia tego?
(Zauważ też, że nie można umieścić [KnownType(...)]
atrybuty Wrapper
, gdyż nie jest w moim typie. Config wydaje się być jedynym sposobem.)
EDIT
@ odpowiedź Baretta pracował ładnie. Zauważ jednak, że początkowo otrzymałem ten błąd:
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.
Nie wspomniałem o tym w pierwotnym pytaniu, ale mój typ ma jawną nazwę kontraktu danych. Coś takiego:
[DataContract(Name = "Data")]
public class Data<TKey> { ... }
Powyższy błąd wystąpił aż usunąłem wartość Name
właściwości z atrybutem. Mam nadzieję, że pomaga to komuś innemu. Nie wiem, jaki format działa w tym scenariuszu. Te nie:
[DataContract(Name = "Data\`1")]
[DataContract(Name = "Data{TKey}")]
Ktoś wie jak to zrobić?
EDIT 2
Dzięki ponownie do @baretta który wskazał, że poprawna składnia jest w rzeczywistości:
[DataContract(Name = "Data{0}")]
Tak, wiem! :) Zmieniłem moją odpowiedź – baretta