C#中将基类实例转换为派生类(Downcast)假设我有两个类:classEmployee和classAdvancedEmployee:EmployeeI知道这样的事情是行不通的,因为我不能贬低C#:varemployee=newEmployee();varadvanced=employeeasAdvancedEmployee;我的问题是:如何以高效的方式完成垂头丧气?我实际上在AdvancedEmployee上有一个构造函数,它将Employee作为参数并使用它来注入它的值,基本上是克隆。更新为了解决可能的重复数据,我改变了我的方法,使AdvancedEmployee现在包含一个雇员而不是一个雇员。示例:员工类;classAdvancedEmployee{privateemployeepublicAdvancedEmployee(Employeeemployee){this.employee=employee}}创建一个接口。由于您无法修改Employee,因此创建一个您拥有的适配器:classEmployeeAdapter:IEmployee{publicEmployeeAdapter(Employeeemp){this.emp=emp;}publicintSomeMethodInEmployee(){returnemp.SomeMethodInEmployee();}}classAdvancedEmployee:IEmployee{}不能是actor,其实是不同类型之间的转换。我会添加一个ctor或静态成员函数,如AdvancedEmployeeFromBase(Employeee),它从给定的基类型构造派生类型。创建一个新对象是最易读和最清晰的方式。您还可以在Employee类中定义显式或隐式类型转换运算符。publicstaticexplicitoperatorAdvancedEmployee(Employeee){returnnewAdvancedEmployee(e);}然后像这样使用它:vare=newEmployee();varae=(AdvancedEmployee)e;这是我以前的一种处理方式,我觉得挺酷的。。。如果Employee和AdvancedEmployee中的所有数据元素都是Properties,那么就可以使用反射将数据值从基类复制到派生类.然后你就可以像他原来那样使用派生类,而不用封装基类。publicclassEmployee{publicintID{get;放;}公共字符串Foo{得到;放;}publicvoidSomeMethod(){}}publicclassAdvancedEmployee:Employee{publicstringBar{get;{}}Employeeemp=newEmployee(){ID=5,Foo="Hello"};//从empAdvancedEmployeeadvEmp=newAdvancedEmployee(){Bar="ApropnotinEmpthatmightneedavalue"}foreach(varpintypeof(Employee).GetProperties(BindingFlags.Public|BindingFlags.Instance)).Where(x=>x.CanWrite))typeof(AdvancedEmployee).GetProperty(p.Name).SetValue(advEmp,p.GetValue(emp));与在C#中一样检查运行时类型。也就是说,如果被测试的对象真的不是AdvancedEmployee,那么您就不会神奇地将Employee转换为AdvancedEmployee。因此,如果您需要AdvancedEmployee,则需要以某种方式自己构建它。根据您要实现的目标,有不同的方法。也许您可以使用构造函数AdvancedEmployee(Employeeproto)来从proto复制所需的值?或者您可能需要用AdvancedEmployee包装现有的Employee。请注意,您可能需要将存储旧Employee的代码替换为新创建的AdvancedEmployee。一种方法(带有一些Java味道)可能是创建一个Employee工厂,如果需要,它将创建一个AdvancedEmployee。然后你需要让你所有的代码都使用工厂而不是用new创建Employee。但如果您仍然需要更改运行时类型,这种情况就无济于事。以上就是《C#学习教程:C#中将基类实例转换为派生类(向下转换)》的全部内容。如果对您有用,需要了解更多C#学习教程,希望您多加关注——本文整理自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
