C# 无法从基转换为派生

C# 无法从基转换为派生,c#,wcf,C#,Wcf,我有一个类Employee,以及由此派生的FulltimeEmployee和ParttimeEmployee类。我在Employee类上应用[KnownType]属性。Employee类用作WCF服务的DataContract。 我有一个MVC应用程序作为WCF客户端。我根据需要成功检索FulltimeEmployee或ParttimeEmployee,并将其用作视图的模型。该模型是基本类型的Employee。将保留层次结构: [System.Diagnostics.DebuggerStepTh

我有一个类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);
并确保它已返回到
控制器

public ActionResult HorriblyBad(BadPractice badPractice)
{
    if (badPractice.Type == EmployeeType.FullTime)
    {
        ...
    }
}

请注意,由于设计不好,您必须做的所有工作。我不会继续看那些教程。

“当我试图拯救一名新员工时”,我看不到任何与拯救相关的内容。它到底在哪里失败了?通常当使用这样的构造(检查type==x等)表示设计错误时,这里没有足够的关于类及其层次结构的信息,甚至没有您提到的实际强制转换代码。如果
Employee
不是一个抽象类,并且您有一个这种类型的实际实例化对象,那么显然您不能将其强制转换为子类型。因为它不是。你说过MVC中的视图模型是基本类型
Employee
。这意味着view将把
Employee
的实例提交回控制器。此时,您没有关于
Employee
的子类型的任何信息,因此无法将其强制转换为子类型。这就是OOP的基本原理。基本上,这种方法会丢失子类型的属性。因此,您需要为每个子类型创建不同的视图和post操作作为模型。谢谢您的回答。这实际上是一个很好的WCF教程。作为奖励,在这种情况下,你会建议什么样的设计?