2016-03-01 108 views
1

我有一個類A和一個類B,它來自A。我有一個B的實例,即b,我只想從中提取A部分。喜歡的東西:從派生對象中提取基礎對象

var b = new B(); 
A a = (SomeCast)b; 

美中不足的是a.GetType()應該返回A類型不B

是否可以不創建A的實例並手動複製b的所有字段和屬性?

更新 問題的根源來自實體框架,它不允許派生類型被添加以代替基類型。我有一個biiig派生類型(我不允許添加註釋),並且只想將基本部分添加到數據庫中。

我只是好奇,有一個簡單的答案。

+6

基本多態性的結論是'B' *是*'A'爲所有意圖和目的的實例。 'a a = b;'在邏輯上是'A'的一個實例。你爲什麼還需要'GetType()'來證明這一點?退一步,這裏解決的問題是什麼? – David

+1

問題的根源來自Entity Framework,它不允許派生類型被添加來代替基類型。我有一個biiig派生類型(我不允許添加註釋),並且只想將基本部分添加到數據庫中。 –

+2

您應該明確地將該上下文添加到問題中,以及嘗試在EF中使用該變量以及導致錯誤的示例。這可能更像是一個EF問題而不是一個多態問題,並且您需要確保該問題吸引了正確的專家關注。 – David

回答

0

如果從AB繼承,他們的B所有實例將是A太多的情況下,各個領域和A性質的B一個實例可用。

在代碼中,你不需要投,只是使分配:

var b = new B(); 
A a = b; 

但不需要這個,你可以用b工作爲A一個實例,而無需創建變量a

+0

謝謝Arturo,但a.GetType()返回B,而不是A. –

+0

當然,如果a.GetType()返回A,那麼您會失去B中所有額外的東西?我在想這裏的對象切片。整個「不允許派生類型被添加到基類型的地方」真的很奇怪。我想如果這些對象是通過值複製的,那麼你會遇到切片問題。 – Skizz

0

免責聲明:醜陋的代碼提前

嗯,我要去冒險自己收到大量的負反饋,但是讓我們看看這是OP想要的東西。

正如大家已經告訴過你的,沒有辦法將派生「剝離」到基類。所以我在這裏提出的只是使用反射的黑客。

public class A 
{ 
    public A() 
    { 
    } 

    public A(B inhClass) 
    { 
     foreach (var prop in typeof(A).GetProperties()) 
     { 
      PropertyInfo myPropInfo = typeof(B).GetProperty(prop.Name); 
      prop.SetValue(this, myPropInfo.GetValue(inhClass, null), null); 
     } 
    } 
    public string a { get; set; } 
} 

public class B:A 
{ 
    public string b { get; set; } 
    public A baseclass 
    { 
     get 
     { 
      return new A(this); 
     } 
    } 


} 

正如你所看到的,在課堂上BI添加一個新的財產返還類答:使用新構造的新實例這種新的構造函數中的循環基類的所有屬性和派生類中獲得的價值。

就是這樣,我向公衆開放私刑:)

相關問題