繁体   English   中英

将一种类型转换为另一种类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM