簡體   English   中英

當兩個對象都是不同的類型但是從同一個父類繼承時,如何將一個對象轉換為另一個對象

[英]How to convert one object to another when both are different types but inherit from the same parent class

我有2個對象,對象A和對象B.A具有屬性顏色和大小,B具有屬性顏色,大小和深度。

A和B都繼承自C,這是一個抽象類。

如何在運行時將B轉換為A?

 abstract class C {

 }

 Class A: C {
     int color;
     int size;
 }

 Class B: C {
     int color;
     int size;
     int depth;
 }

 main() {
     //creating object A
     A objA = new A();
     A.color = 46;
     A.size = 90;

     //creating object B
     B objB = new B();
     B.color = 23;
     B.size = 10;
     B.depth = 78;

     //How to do casting 
     A = B;
 }

您可以在類B添加顯式強制轉換運算符:

Class B: C {
    int color;
    int size;
    int depth;
    public static explicit operator A(B b)
    {
        return new A() {color = b.color, size = b.size};
    }
}

然后,您可以使用強制轉換將B轉換為A

A a = (A)b;

當我遇到這樣的問題時,我使用了AutoMapper。

這是一個免費的庫,允許您將一個對象映射到另一個對象,甚至允許您將一個字段映射到另一個不同名稱和類型的字段。

您還可以將List<A>轉換為List<B> ,這很方便。

Github上的AutoMapper鏈接

編輯

在閱讀完最后評論后,我認為AutoMapper可能是您的解決方案。

您沒有明確需要指定除以外的任何內容;

AutoMapper.CreateMap<A,B>();

然后你可以映射;

B b = Mapper.Map<A,B>(sourceA);

編輯2

或者自己使用反射並創建一個以A作為參數的擴展,並將適當的字段/屬性從A復制到B.

在這種情況下,如果沒有一些額外的工作,你不能直接將B轉換為A.

如果將公共字段移動到基類中,則可以將B傳遞給期望基類實例的方法,並且只訪問公共字段。

如果您不想這樣做,您的其他選項是編寫轉換方法或添加隱式轉換,以便您可以將B轉換為A或使用類似Automapper的庫

隱式轉換可能看起來像這樣

Public static implicit operator A (B theB)
{
    return new A (theB.colour, theB.size);
}

然后允許您將B實例轉換為A實例。

A myA = (A)myB;

我仍然會懷疑這是不是一個好主意

它不會像這樣工作。 您正在制作兩個具有幾乎相同屬性的變量?! 為什么這樣?

您可以將公共字段強制轉換為基類! 這是最好的方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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