我有一個類型,我們稱之爲Data<TKey>
。我還有一個WCF服務契約,它接受一個類型爲Object
的類型(讓我們稱它爲Wrapper
)(由於我不會介入的原因,這不是可選的)。如何在通用配置中指定WCF已知類型?
[DataContract]
public class Data<TKey> { ... }
[DataContract]
public class Wrapper
{
[DataMember]
public object DataItem { get; set; }
}
現在,我要送兩個類IntData
和LongData
:
[DataContract]
public class IntData : Data<int> { /*empty*/ }
[DataContract]
public class LongData : Data<long> { /*empty*/ }
他們在已知類型的配置文件同時配置。配置類似於這樣的:
<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>
在這一點上,一切工作正常。
但我即將添加第三種類型,我不喜歡有不必要的空.NET類IntData
和LongData
。它們只存在,因爲...
我不知道如何在WCF配置中指定泛型類型!
我想做這樣的事情,但不知道確切的語法。
<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>
這是什麼正確的語法?
(還請注意,我不能把Wrapper
[KnownType(...)]
屬性,因爲它不是我喜歡的類型。配置似乎是唯一的出路。)
編輯
@巴雷塔的回答很好地工作。但請注意,最初我收到此錯誤:
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.
我沒有在原始問題中提到它,但我的類型具有明確的數據合同名稱。事情是這樣的:直到我刪除從屬性Name
屬性值
[DataContract(Name = "Data")]
public class Data<TKey> { ... }
發生上述錯誤。希望也能幫助別人。我不知道在這種情況下工作的格式是什麼。這些沒有:
[DataContract(Name = "Data\`1")]
[DataContract(Name = "Data{TKey}")]
任何人都知道如何做到這一點?
EDIT 2
再次感謝@baretta誰指出,正確的語法是事實:
[DataContract(Name = "Data{0}")]
是的,我知道! :)我編輯了我的答案 – baretta 2009-07-03 16:20:42