我在单独的程序集中定义了一个接口和一个类,如下所示:
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 ) ) ]
到我的服务接口,正如理查德所建议的那样。客户端代理看起来还是一样的,
public object GetPerson() { return base.Channel.GetPerson();
,但现在它不会爆炸。但是,客户端只有一个“对象”,因此它必须在它有用之前将其转换为 IPerson。
var person = client.GetPerson ( );
Console.WriteLine ( ( ( IPerson ) person ).Name );