C# 无法从基转换为派生
我有一个类Employee,以及由此派生的FulltimeEmployee和ParttimeEmployee类。我在Employee类上应用[KnownType]属性。Employee类用作WCF服务的DataContract。C# 无法从基转换为派生,c#,wcf,C#,Wcf,我有一个类Employee,以及由此派生的FulltimeEmployee和ParttimeEmployee类。我在Employee类上应用[KnownType]属性。Employee类用作WCF服务的DataContract。 我有一个MVC应用程序作为WCF客户端。我根据需要成功检索FulltimeEmployee或ParttimeEmployee,并将其用作视图的模型。该模型是基本类型的Employee。将保留层次结构: [System.Diagnostics.DebuggerStepTh
我有一个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教程。作为奖励,在这种情况下,你会建议什么样的设计?