我有一个类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
};
你能解释一下为什么会这样吗?
答案 0 :(得分:1)
我不会详细说明,因为评论中已经提到过这是一个糟糕的设计,而且由于你提到你正在学习教程,我不会狠狠地对你说。
快速,脏的修复方法是加载所有属性,无论其类型如何:
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)
{
...
}
}
请注意由于设计不当而必须完成的所有工作。我不会继续观看那些教程。