无法从Base转换为Derived

问题描述 投票:0回答:1

我有一个类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
            };

你能解释一下为什么会这样吗?

c# wcf
1个回答
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)
    {
        ...
    }
}

请注意由于设计不当而必须完成的所有工作。我不会继续观看那些教程。

© www.soinside.com 2019 - 2024. All rights reserved.