使用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类型而不做显式转换?

使用ServiceKnownType的WCF返回接口类型

是否有多个类实现IPerson接口?

如果你知道GetPerson函数的返回类型总是Person,为什么要有IPerson?只需更改IPersonService接口上方法的接口,使其返回Person而不是IPerson,并更新客户端的服务引用。这将给你一个返回Person对象的GetPerson(因此不需要强制类型转换)。

另一方面,如果您将拥有多个IPerson类型的类(如Employee, Customer, Person等)而且GetPerson方法可以返回这些类型中的一个以上,那么强制转换是您摆脱这种情况的唯一方法,因为返回的对象类型可以变成实现IPerson的任何类型。