我有一個接口,並在單獨的組件中定義的類,像這樣的工作:無法獲得KnownType與WCF
namespace DataInterfaces
{
public interface IPerson
{
string Name { get; set; }
}
}
namespace DataObjects
{
[DataContract]
[KnownType(typeof(IPerson)) ]
public class Person : IPerson
{
[DataMember]
public string Name { get; set; }
}
}
這是我的服務接口:
public interface ICalculator
{
[OperationContract]
IPerson GetPerson ();
}
當我更新我爲我的客戶服務參考,我得到這個在Reference.cs:
public object GetPerson() {
return base.Channel.GetPerson();
我希望KnownType會給我IPerson,而不是「對象「在這裏。
我也試過[KnownType(typeof(Person)) ]
,結果相同。我控制了客戶端和服務器,因此我在兩個地方都有DataObjects(定義了Person)和DataInterfaces(定義了IPerson)程序集。有什麼明顯的我失蹤?我認爲KnownType是能夠使用WCF接口的答案。
-----更多信息請----- 我從Person類中刪除的KnownType並添加
[ServiceKnownType(typeof(Person)) ]
我的服務接口,由Richard的建議。客戶端代理仍然看起來相同,但現在它不會炸燬。但是現在它不會爆炸。然而,客戶端只有一個「對象」,因此它必須在IPerson有用之前將其轉換爲IPerson。
var person = client.GetPerson ();
Console.WriteLine (((IPerson) person).Name);
我希望這不是答案:)因爲這意味着我不能有單獨的DataObjects和DataInterfaces,因爲這使得循環引用。 'Person:IPerson'與''KnownType Person for IPerson' ...我想我會嘗試它,但我得到一個編譯錯誤,說KnownType只能用於類,結構... –
是的,他們需要進入同一個程序集。另外,如果你的基類是一個類而不是一個接口,你可以通過基類[KnownType(MethodName = ...)]上的靜態方法提供已知類型。或者你可以直接向序列化程序提供已知類型,而不是依靠它來通過屬性或靜態方法發現它們。 –
我真的想把這些程序集分開,但我很欣賞替代方案 - 好的食物。 –