使用ServiceKnownType的WCF返回接口类型
本文关键字:返回 接口类型 WCF ServiceKnownType 使用 | 更新日期: 2023-09-27 17:53:24
我正在实现以下WCF服务
[ServiceContract]
[ServiceKnownType(typeof(Person))]
public interface IPersonService
{
[OperationContract]
IPerson GetPerson();
}
[AspNetCompatibilityRequirements(RequirementsMode =AspNetCompatibilityRequirementsMode.Allowed)]
public class PersonService : IPersonService
{
public IPerson GetPerson()
{
return new Person();
}
}
接口IPerson被定义
public interface IPerson
{
string FirstName { get; set; }
string LastName { get; set; }
}
,实现接口的Person类定义为
[DataContract]
public class Person : IPerson
{
[DataMember]
public string FirstName { get; set; }
[DataMember]
public string LastName { get; set; }
}
问题是当我引用PersonService并调用GetPerson方法时,我得到的结果是类型对象而不是类型Person。要获得Person类型,我必须进行显式强制类型转换。
static void Main(string[] args)
{
var proxy = new PersonServiceReference.PersonServiceClient();
PersonServiceReference.Person person = (PersonServiceReference.Person)proxy.GetPerson();
}
是否有任何方法可以让GetPerson web方法返回IPERSON类型而不做显式转换?
是否有多个类实现IPerson接口?
如果你知道GetPerson函数的返回类型总是Person,为什么要有IPerson?只需更改IPersonService接口上方法的接口,使其返回Person而不是IPerson,并更新客户端的服务引用。这将给你一个返回Person对象的GetPerson(因此不需要强制类型转换)。
另一方面,如果您将拥有多个IPerson类型的类(如Employee, Customer, Person等)而且GetPerson方法可以返回这些类型中的一个以上,那么强制转换是您摆脱这种情况的唯一方法,因为返回的对象类型可以变成实现IPerson的任何类型。