簡體   English   中英

將一種類型轉換為另一種類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM