好吧,就是这样!!我知道我确实犯了一些错误,但我想澄清一些基本问题,我想成功地实现这些错误。我有一个Employee类,它是WCF和FullTimeEmployee中的一个FullTimeEmployee,PartTimeEmployee扩展了这个类。在我的EmployeeService中,我们分别根据控制台应用程序客户端的用户输入返回FullTimeEmployee和PartTimeEmployee的对象(仅用于演示目的)。现在,我想通过MessgaeContract来调整SOAP消息。我希望请求对象被称为EmployeeRequestObject,响应对象EmployeeResponseObject和我希望在它们的头中包含相同的许可密钥。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
namespace EmployeeServiceLibrary
{
[ServiceContract]
public interface IEmployeeService
{
[OperationContract]
EmployeeResponse GetEmployee(EmployeeRequest request);
}
#region EmployeeRequestObject
[MessageContract(IsWrapped=true,WrapperName="EmployeeRequestObject",WrapperNamespace="http://Chiranjib_VAIO.com/")]
public class EmployeeRequest
{
[MessageBodyMember(Namespace = "http://Chiranjib_VAIO.com/")]
public int EmployeeRequestID { get; set; }
[MessageHeader(Namespace = "http://Chiranjib_VAIO.com/")]
public string EmployeeRequestLicenseKey { get; set; }
}
#endregion
#region EmployeeResponseObject
public class EmployeeResponse
{
public EmployeeResponse()
{
}
public EmployeeResponse(EmployeeRequest e)
{
this.EmployeeResponseLicenseKey = e.EmployeeRequestLicenseKey+"_Response";
}
[MessageHeader(Namespace = "http://Chiranjib_VAIO.com/")]
public string EmployeeResponseLicenseKey { get; set; }
}
#endregion
[KnownType(typeof(FullTimeEmployee))]
[KnownType(typeof(PartTimeEmployee))]
[DataContract]
public abstract class Employee
{
[DataMember]
public int EmployeeId { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public string Gender { get; set; }
[DataMember]
public EmployeeType EmpType { get; set; }
}
public enum EmployeeType
{
FullTimeEmployee=0,
PartTimeEmployee=1
}
[DataContract]
public class FullTimeEmployee : Employee
{
[DataMember]
public decimal AnnualSalary { get; set; }
}
[DataContract]
public class PartTimeEmployee : Employee
{
[DataMember]
public int HoursWorked { get; set; }
[DataMember]
public decimal SalaryPerHour { get; set; }
}
}当用户输入0时,我希望返回一个FullTimeEmployee对象,当输入一个1时,我希望返回一个PartTimeEmployee对象。这是服务文件
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
namespace EmployeeServiceLibrary
{
public class EmployeeService : IEmployeeService
{
public EmployeeResponse GetEmployee(EmployeeRequest request)
{
int empId = request.EmployeeRequestID;
switch (empId)
{
case 0:
return new FullTimeEmployee()
{
EmployeeId=1,
Name="Chiranjib Nandy",
Gender="Male",
EmpType=EmployeeType.FullTimeEmployee,
AnnualSalary=1500
};
case 1:
return new PartTimeEmployee()
{
EmployeeId = 1,
Name = "Archana Nandy",
Gender = "Female",
EmpType = EmployeeType.PartTimeEmployee,
HoursWorked=9,
SalaryPerHour=150
};
default: return null;
}
}
}
}但错误是说不能隐式地将EmployeeServiceLibrary.FullTimeEmployee转换为EmployeeServiceLibrary.EmployeeResponse。如何达到预期的行为?帮助是非常感谢的!!谢谢
发布于 2014-06-08 05:07:24
您的代码不会编译,因为您的两个返回类型都实现了Employee,而不是EmployeeResponse。您可以将Employee对象封装在EmployeeResponse中。
public class EmployeeResponse
{
public EmployeeResponse(EmployeeRequest e)
{
this.EmployeeResponseLicenseKey = e.EmployeeRequestLicenseKey+"_Response";
}
[MessageHeader(Namespace = "http://Chiranjib_VAIO.com/")]
public string EmployeeResponseLicenseKey { get; set; }
public Employee Employee { get; set; }
}然后将代码修改为:
public EmployeeResponse GetEmployee(EmployeeRequest request)
{
int empId = request.EmployeeRequestID;
switch (empId)
{
case 0:
return new EmployeeResponse
{
Employee = new FullTimeEmployee()
{
EmployeeId=1,
Name="Chiranjib Nandy",
Gender="Male",
EmpType=EmployeeType.FullTimeEmployee,
AnnualSalary=1500
}
}
case 1:
return new EmployeeResponse
{
Employee = new PartTimeEmployee()
{
EmployeeId = 1,
Name = "Archana Nandy",
Gender = "Female",
EmpType = EmployeeType.PartTimeEmployee,
HoursWorked=9,
SalaryPerHour=150
}
}
default: return null;
}https://stackoverflow.com/questions/24103107
复制相似问题