class childType: MainType{}
MainType mObj = GetData();
childType cObj = (childType)mObj;
我如何投射
childType cObj = (childType)mObj;
我收到此错误:
无法将类型为“System.Data.Entity.DynamicProxies.MainType_F04DC499C53D433B05ABEDEE7191583DB11728F68B18671613EF0E5AC158DD0D”的对象强制转换为“ChildType”。
答案 0 :(得分:4)
你的子类型中应该有一个构造函数,它接受一个主类型的实例。
然后你可以这样做:
childType cObj = new childType(mObj);
在childType上给出这个构造函数:
public childType(MainType obj)
{
//set child type properties here
}
答案 1 :(得分:1)
你正在尝试的演员实际上是不可能的。如果你有类似的东西;
MainObj myObj = new ChildObj();
ChildObj cObj = (ChildObj)myObj;
它会起作用。你也可以将一个子对象强制转换为它的父类(特定于一般)但你不能从一般到特定,因为MainObj
不足以成为ChildObj
(是ChildObj
1}}足以成为MainObj
,它包含MainObj
所有内容以及更多内容。
您可以为ChildObj创建一个接受MainObj的构造函数,并返回一个ChildObj,其默认值为其他属性,或者只是重新考虑您的设计。你应该问的问题是“我为什么要把一个父母送进一个孩子?”
反之亦然,因为您可能有5个类从公共基类继承并覆盖其中的方法。您希望其他一些方法能够接受所有五种方法并调用其特定功能。这是通过继承或实现接口来完成的。然而,从一般到具体而言,几乎没有任何意义。
答案 2 :(得分:1)
这是因为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属性注入了数百个属性。