C#inheritance和转换

我有以下代码,我得到以下exception“InvalidCastException:无法将’Employee’类型的对象强制转换为’EmployeeProfile’。”

private class Employee { public string Name { get; private set; } public Employee() { this.Name = "employee"; } public override string ToString() { return this.Name; } } private class EmployeeProfile : Employee { public string Profile { get; private set; } public EmployeeProfile() : base() { this.Profile = string.Format("{0}'s profile", this.Name); } public override string ToString() { return this.Profile; } } public void RunTest() { Employee emp = new Employee(); EmployeeProfile prof = (EmployeeProfile)emp; // InvalidCastException here System.Console.WriteLine(emp); System.Console.WriteLine(prof); } 

也许我的大脑已被烧毁,但我认为你可以将一个子类型转换为它的基类型? 我在这里想念的是什么? 也许是假期……谢谢!

可以将子类型转换为其基本类型。 但是您要将基类型的实例转换为子类型。

EmployeeProfile是一名员工。 不一定相反。

这样可行:

 EmployeeProfile prof = new EmployeeProfile(); Employee emp = prof; 

然而,这个模型充满了糟糕的设计。 员工档案不是一种特殊的员工,是吗? 员工拥有个人资料更有意义。 你是在这里的组成模式。

所有答案都是正确的…只是提供一个简单的简单解释……

 class Employee class Female : Employee class Male: Employee 

仅仅因为你是一名Employee并不会让你成为一名Female ……

也许我的大脑已被烧毁,但我认为你可以将一个子类型转换为它的基类型?

您正在尝试将基类型转换为其子类型。 与你说的完全相反:

 Employee emp = new Employee(); EmployeeProfile prof = emp; 

您需要EmployeeProfile中的方法taht将Employee作为参数并创建EmployeeProfile。

 EmployeeProfile enrichEmployee(Employee emp) { EmployeeProfile empprof = new EmployeeProfile(); empprof.property1 = emp.property1; empprof.property2 = emp.property2; empprof.property3 = emp.property3; return empprof; } 

你的方向错了。 在您的代码中,EmployeeProfile是一种特殊类型的Employee,而不是相反。 因此,当您尝试反向转换时,编译器会说’Employee’不是从’EmployeeProfile’派生的

您需要使用像Automapper这样的库。 该库可以填充对象的匹配属性:

 Mapper.Initialize(cfg => { cfg.CreateMap(); }); EmployeeProfile prof = Mapper.Map(emp);