将一种类型转换为另一种类型
本文关键字:类型转换 另一种 类型 一种 | 更新日期: 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个类继承自一个公共基类并覆盖其中的方法。您希望其他方法能够接受这五种方法并调用它们的特定功能。这可以通过继承或实现接口来实现。然而,从一般到具体,几乎没有意义。