这个问题在这里已有答案:
- Is it possible to assign a base class object to a derived class reference with an explicit typecast? 21个答案
在C#中是否可以将基类对象显式转换为其派生类之一?目前我认为我必须为我的派生类创建一个构造函数,它接受一个基类对象作为参数并复制属性值 . 我真的不喜欢这个想法,所以我想尽可能避免它 .
这似乎不应该工作(对象被实例化为新的基础,因此不应该为派生类的额外成员分配内存)但是C#似乎允许我这样做:
class BaseClass
{
... some stuff ...
}
class DerivedClass : BaseClass
{
public bool MyDerivedProperty{ get; set; }
}
static void Main(string[] args)
{
BaseClass myBaseObject = new BaseClass();
DerivedClass myDerivedObject = myBaseObject as DerivedClass;
myDerivedObject.MyDerivedProperty = true;
}
6 回答
不,没有像你说的那样转换类的内置方法 . 最简单的方法是执行您的建议:创建一个
DerivedClass(BaseClass)
构造函数 . 其他选项基本上可以自动地将属性从基础复制到派生实例,例如,使用反射 .您使用
as
发布的代码将编译,如我所见,但在运行时会抛出空引用异常,因为myBaseObject as DerivedClass
将评估为null
,因为它不是DerivedClass
的实例 .那是不可能的 . 但你可以使用像AutoMapper这样的Object Mapper
例:
在global.asax或应用程序启动中:
用法:
它可以通过流畅的API轻松配置 .
我找到了一个解决方案,并不是说它是最好的解决方案,但它对我来说很干净,并且不需要对我的代码进行任何重大更改 . 我的代码看起来与你的相似,直到我意识到它不起作用 .
My Base Class
My Derived Class
Previous method to get a populated base class
Before I was trying this, which gave me a unable to cast error
我改变了我的代码,如下所示,它似乎工作,现在更有意义:
Old
New
Old
New
您可以自己实现转换,但我不建议这样做 . 如果要执行此操作,请查看Decorator Pattern以扩展现有对象的功能 .
不,没有内置的转换 . 您需要创建一个构造函数,就像您提到的那样,或者其他一些转换方法 .
此外,由于BaseClass不是DerivedClass,myDerivedObject将为null,并且上面的最后一行将抛出空引用异常 .
不,这是不可能的 . 唯一可行的方法是