我正在实施以下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类型?
答案 0 :(得分:1)
您是否有多个实现IPerson接口的类?
如果你知道GetPerson函数的返回类型总是Person,为什么要有IPerson?只需在IPersonService接口上更改方法的接口即可返回Person而不是IPerson,并更新客户端中的服务引用。这将为您提供一个返回Person对象的GetPerson(因此无需强制转换)。
另一方面,如果你将拥有多个类型的IPerson(如Employee,Customer,Person等),并且方法GetPerson CAN返回多个类型,那么转换是你唯一的出路,因为返回的对象类型可以变成任何实现IPerson的类型。