2013-04-30 49 views
1
class childType: MainType{} 

MainType mObj = GetData(); 

childType cObj = (childType)mObj; 

我怎麼能投上述鑄造一種類型到另

childType cObj = (childType)mObj; 

我得到這個錯誤:

Unable to cast object of type 'System.Data.Entity.DynamicProxies.MainType_F04DC499C53D433B05ABEDEE7191583DB11728F68B18671613EF0E5AC158DD0D' to type 'ChildType'.

+0

'GetData();'返回什麼類型?它真的是'childType'嗎? – 2013-04-30 22:11:34

+0

如果您的'GetData()'方法返回'MainType'的一個實例,那麼您無法合法地將其轉換爲'childType'。如果'GetData()'返回一個'childType'對象或者派生自它的東西,那麼這個強制轉換就可以工作。這是設計。你可以嘗試'childType cObj = mObj作爲childType;'如果類型不兼容,將導致null。 – Corey 2013-04-30 22:11:42

+0

@DStanley GetData()返回MainType – HaBo 2013-04-30 22:50:49

回答

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屬性注入的。

+0

聽起來很有希望,會試試這個,讓你知道 – HaBo 2013-05-01 11:37:31

+0

非常好,這就是我想要它工作。希望進一步發展,我不會與ValuInjector有任何問題。謝謝 – HaBo 2013-05-01 13:29:31

4

你應該有一個構造函數在你的孩子類型採用的一個實例主要類型。

然後,你可以這樣做:

childType cObj = new childType(mObj); 

鑑於childType此構造函數:

public childType(MainType obj) 
{ 
    //set child type properties here 
} 
+2

從技術上講,這是一個副本,而不是演員,但它可能是OP所需要的。 – 2013-04-30 22:07:03

+0

@DStanley微妙的不同,但100%正確:)。我懷疑這也是OP所需要的。 – mattytommo 2013-04-30 22:10:10

+0

一個顯式的轉換運算符是一個類似的選擇,但我認爲OP會對* cast *而不是* convert *有效的時間感到困惑。 – Corey 2013-04-30 22:14:33

1

你試圖鑄造實際上不太可能。如果你有類似的東西;

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

它會工作。你也可以將子對象投射到它的父類(特定於一般),但不能從一般到具體,因爲MainObj不足以作爲ChildObj(作爲ChildObj就足夠作爲MainObj,它具有一切MainObj已加上更多)。

您可以爲ChildObj創建一個構造函數,該構造函數接受一個MainObj並返回一個ChildObj,其默認值爲其他屬性,或者只是重新考慮您的設計。你應該問一個問題:「爲什麼我會把父母交給一個孩子?」

正好相反,因爲您可能有5個類從公共基類繼承並覆蓋其中的方法。您希望其他方法能夠接受所有五種方法並調用其特定的功能。這是通過繼承或通過實現接口來完成的。然而,從一般到具體,並沒有多少意義。