无法从Base转换为Derived

时间:2018-03-01 14:44:24

标签: c# wcf

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

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

1 个答案:

答案 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)
    {
        ...
    }
}

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