将一种类型转换为另一种

时间:2013-04-30 22:01:19

标签: c# entity-framework casting

class childType: MainType{}

MainType mObj = GetData();

childType cObj = (childType)mObj;

我如何投射

childType cObj = (childType)mObj;

我收到此错误:

  

无法将类型为“System.Data.Entity.DynamicProxies.MainType_F04DC499C53D433B05ABEDEE7191583DB11728F68B18671613EF0E5AC158DD0D”的对象强制转换为“ChildType”。

3 个答案:

答案 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属性注入了数百个属性。