1
class childType: MainType{}

MainType mObj = GetData();

childType cObj = (childType)mObj;

我怎样才能在上面投射

childType cObj = (childType)mObj;

我收到此错误:

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

4

3 回答 3

4

您的子类型中应该有一个构造函数,该构造函数采用主类型的实例。

然后你可以这样做:

childType cObj = new childType(mObj);

给定 childType 上的这个构造函数:

public childType(MainType obj)
{
    //set child type properties here
}
于 2013-04-30T22:03:10.707 回答
1

您尝试的演员阵容实际上是不可能的。如果你有类似的东西;

 MainObj myObj = new ChildObj();
 ChildObj cObj = (ChildObj)myObj;

它会起作用的。您也可以将子对象强制转换为它的父类(特定于一般),但您不能从一般转到特定,因为 aMainObj不足以成为 a ChildObj(作为 a足以ChildObj成为 a MainObj,它拥有一切MainObj,还有更多)。

您可以为 ChildObj 创建一个构造函数,该构造函数接受 MainObj 并返回具有其他属性的默认值的 ChildObj,或者只是重新考虑您的设计。你应该问“我为什么要把父母变成孩子?”的问题。

反之亦然,因为您可能有 5 个类继承自一个公共基类并覆盖其中的方法。您希望其他方法能够接受所有五个并调用它们的特定功能。这是通过继承或实现接口来实现的。然而,从一般到具体,几乎没有意义。

于 2013-04-30T22:13:14.853 回答
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 属性注入。

于 2013-05-01T09:38:42.400 回答