【问题标题】:WCF return interface type using ServiceKnownTypeWCF 使用 ServiceKnownType 返回接口类型
【发布时间】:2014-03-25 16:22:56
【问题描述】:

我正在实现以下 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 类型,我必须进行显式转换。

static void Main(string[] args)
        {
            var proxy = new PersonServiceReference.PersonServiceClient();
            PersonServiceReference.Person person = (PersonServiceReference.Person)proxy.GetPerson();
        }

有什么方法可以让 GetPerson Web 方法返回 IPERSON 类型而不进行显式转换?

【问题讨论】:

标签: c# wcf interface serviceknowntype


【解决方案1】:

你有不止一个类实现 IPerson 接口吗?

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    相关资源
    最近更新 更多