[英]Cast one type to another
class childType: MainType{}
MainType mObj = GetData();
childType cObj = (childType)mObj;
我怎样才能在上面
childType cObj = (childType)mObj;
我收到此错误:
无法将类型为'System.Data.Entity.DynamicProxies.MainType_F04DC499C53D433B05ABEDEE7191583DB11728F68B18671613EF0E5AC158DD0D'的对象强制转换为类型'ChildType'。
您的子类型中应该有一个构造函数,该构造函数采用主类型的实例。
然后,您可以执行以下操作:
childType cObj = new childType(mObj);
在childType上指定此构造函数:
public childType(MainType obj)
{
//set child type properties here
}
您尝试的演员表实际上是不可能的。 如果你有类似的东西;
MainObj myObj = new ChildObj();
ChildObj cObj = (ChildObj)myObj;
它会工作。 你也可以投一个子对象到它的父类(特殊到一般),但你不能从一般到特殊,因为作为一个MainObj
是不够的,作为一个ChildObj
(是一个ChildObj
,作为一个为sufficent MainObj
,它有MainObj
所有MainObj
以及更多内容)。
您可以为ChildObj构造一个接受MainObj并返回其其他属性带有默认值的ChildObj的构造函数,或者只是重新考虑您的设计。 您应该问“我为什么要把父母丢给孩子?”的问题。
相反,这是有道理的,因为您可能有5个类继承自公共基类并覆盖其中的方法。 您希望其他方法能够接受所有这五个方法并调用它们的特定功能。 这可以通过继承或实现接口来实现。 然而,从一般到具体,几乎没有什么意义。
这是由于EF5动态代理。 即使你想投
mObj = (MainType)cObj;
这样,你不会。 因为dynaimc代理会创建运行时具体类型。 因此,您可以禁用动态代理或显式注入值。 如果关闭动态代理,则不能使用延迟加载。
所以我的建议只是使用ValueInjecter 。 它具有对象的扩展方法。 您可以这样写:
//this is not dynamic proxy object.
childType cObj = new childType().InjectFrom(mObj) as childType;
//or
// but this comes from dynamic proxy.
childType cObj = DbSet<childType>.Create().InjectFrom(mObj) as childType;
您将看到mObj属性注入了所有数百个属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.