我有一个类Employee,以及从它派生的FulltimeEmployee和ParttimeEmployee类。我在Employee类上应用[KnownType]属性。 Employee类用作WCF服务的DataContract。 我有一个MVC应用程序作为WCF客户端。我根据需要成功检索了FulltimeEmployee或ParttimeEmployee,并将其用作视图的模型。该模型是基本类型Employee。层次结构保留:
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "0.5.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="FullTimeEmployee", Namespace="http://schemas.datacontract.org/2004/07/EmployeeService")]
public partial class FullTimeEmployee : EmployeeService.Employee
{
...
但是当我尝试保存新员工时,我得到一个例外:
InvalidCastException:无法将类型为“EmployeeService.Employee”的对象强制转换为“EmployeeService.PartTimeEmployee”。
这是代码:
Employee emp = null;
if(employee.Type == EmployeeType.FullTimeEmployee)
{
...
}
else
{
emp = new PartTimeEmployee
{
Name = employee.Name,
Gender = employee.Gender,
Type = employee.Type,
DateOfBirth = employee.DateOfBirth,
HourlyPay = ((PartTimeEmployee)employee).HourlyPay,
HoursWorked = ((PartTimeEmployee)employee).HoursWorked
};
你能解释一下为什么会这样吗?
我不会详细说明,因为在评论中已经提到这是一个可怕的设计,并且因为你提到你正在学习一个教程,所以我不会狠狠地对你说。
快速,脏的修复是加载所有属性,无论类型如何:
public class BadPractice
{
... full time properties
... part time properties
}
然后,加载它:
var badPractice = new BadPractice();
if (...)
{
badPractice.PartTimeProperty = ...;
}
else
{
badPractice.FullTimeProperty = ...;
}
return View(badPractice);
并确保它返回到Controller
:
public ActionResult HorriblyBad(BadPractice badPractice)
{
if (badPractice.Type == EmployeeType.FullTime)
{
...
}
}
请注意由于设计不当而必须完成的所有工作。我不会继续观看那些教程。