使用ServiceKnownType的WCF返回接口类型

时间:2014-03-25 16:22:57

标签: c# wcf interface serviceknowntype

我正在实施以下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类型?

1 个答案:

答案 0 :(得分:1)

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

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

另一方面,如果你将拥有多个类型的IPerson(如Employee,Customer,Person等),并且方法GetPerson CAN返回多个类型,那么转换是你唯一的出路,因为返回的对象类型可以变成任何实现IPerson的类型。