无法从Base转换为Derived

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法从Base转换为Derived相关的知识,希望对你有一定的参考价值。

我有一个类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)
    {
        ...
    }
}

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

以上是关于无法从Base转换为Derived的主要内容,如果未能解决你的问题,请参考以下文章

从派生**到基础**的转换

试图从 Derived* 的向量中分配 Base* 的向量

如何从 Derived 内部调用 Base 实例中的受保护成员函数?

无法访问受保护的成员[重复]

模仿`super`关键字:在实例化期间设置`base`类和`derived`类字段

C++中 OOP相关的类型转换