簡體   English   中英

C# 將枚舉從一個 object 復制到另一個

[英]C# Copying Enumeration from one object to another

我有兩個非常相似但不相同的 C# 對象。 我將值從一個 class 復制到另一個。

每個 class 都有一些公開枚舉類型的屬性。 枚舉的內部相同,但名稱不同,例如

public enum EnumA
{
 A,
 B
} 

public EnumA EnumAProperty
{
 get{ return enumA;}
}

public enum EnumB
{
 A,
 B
} 

public EnumB EnumBProperty
{
 get{ return enumB;}
}

我想將從 EnumBProperty 返回的值分配給 EnumAProperty 這可能嗎?

每個enum成員都有一個對應的 integer 值。
默認情況下,這些值按升序分配,從0開始。

如果枚舉中項目的順序(以及它們的數值)相同,您可以將數值轉換為EnumB以獲得具有相同值的EnumB成員:

 EnumBProperty = (EnumB)(int)EnumAProperty;

如果沒有,您需要重新解析它:

EnumBProperty = (EnumB)Enum.Parse(typeof(EnumB), EnumAProperty.ToString());

你可以通過強制轉換來做,但我不推薦它,因為它很脆弱——如果任何枚舉成員被重新排序或添加了新項目,結果可能不是你所期望的。

EnumAProperty = (EnumA) EnumBProperty;

更糟糕的是,如果你的源枚舉中有項目,而目標中沒有對應的項目——下面的顏色比形狀多:

enum Color { Red = 0, Yellow = 1, Blue = 2 };
enum Shape ( Square = 0, Triangle = 1 };

Color color = Color.Red;
Shape shape = (Shape) color;

即使未定義此值, shape也可能以值2結束。

相反,我建議您對 map 使用switch語句:

EnumAProperty = ConvertToA(EnumBProperty);

...

private static EnumA ConvertToA(EnumBProperty b)
{
    switch (b)
    {
        case EnumB.Flannel: return EnumA.HandTowel;
        case EnemB.Vest: return EnumA.UnderShirt;
        ...
        default: throw new ArgumentOutOfRangeException("b");
    }
}

只要兩個枚舉類型不同,您就不能直接分配它。 您可以為項目定義 integer 偏移量,以便您可以通過 integer 值分配值

public enum EnumA 
{  
 A = 0,  
 B = 1
}   

public enum EnumB
{  
 A = 0,  
 B = 1
}   

EnumBPropertry = (int)EnumAProperty

您可以將其轉換為 integer 或將其轉換為字符串,然后對其執行 Enum.Parse。

嘗試以下操作:

EnumAProperty = (EnumA)Enum.Parse(typeof(EnumA), EnumBProperty.ToString);
EnumBProperty = (EnumB)Enum.Parse(typeof(EnumB), EnumAProperty.ToString());

暫無
暫無

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

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