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

本文关键字:类型转换 另一种 类型 一种 | 更新日期: 2023-09-27 18:11:47

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
}

这是因为EF5动态代理。即使你想转换

mObj = (MainType)cObj; 
像这样的

,你不会。因为动态代理创建运行时具体类型。因此,您可以禁用动态代理或显式注入值。如果你关闭动态代理,你也不能使用延迟加载。

所以我的建议只是使用valueinjector。它有对象的扩展方法。你可以这样写:

//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属性注入的

您尝试的强制转换实际上是不可能的。如果你有像;

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

可以。您也可以将子对象转换为它的父类(特定于一般),但您不能从一般到特定,因为作为MainObj不足以成为ChildObj(作为ChildObj足以成为MainObj,它拥有MainObj所拥有的一切)。

你可以为ChildObj创建一个构造函数,它接受一个MainObj,并返回一个带有其他属性默认值的ChildObj,或者重新考虑你的设计。你应该问这样一个问题:"为什么我要把父母塑造成孩子?"

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

相关文章: