[英]Cast one type to another
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
}
您嘗試的演員表實際上是不可能的。 如果你有類似的東西;
MainObj myObj = new ChildObj();
ChildObj cObj = (ChildObj)myObj;
它會工作。 你也可以投一個子對象到它的父類(特殊到一般),但你不能從一般到特殊,因為作為一個MainObj
是不夠的,作為一個ChildObj
(是一個ChildObj
,作為一個為sufficent MainObj
,它有MainObj
所有MainObj
以及更多內容)。
您可以為ChildObj構造一個接受MainObj並返回其其他屬性帶有默認值的ChildObj的構造函數,或者只是重新考慮您的設計。 您應該問“我為什么要把父母丟給孩子?”的問題。
相反,這是有道理的,因為您可能有5個類繼承自公共基類並覆蓋其中的方法。 您希望其他方法能夠接受所有這五個方法並調用它們的特定功能。 這可以通過繼承或實現接口來實現。 然而,從一般到具體,幾乎沒有什么意義。
這是由於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屬性注入了所有數百個屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.