2014-11-14 151 views
0

我有一個C#類:無法施展C#枚舉C++枚舉當枚舉是第三裝配

public class MyManagedClass 
{ 
    public ManagedEnum EnumValue {get; set;} 
} 

它使用C#枚舉

public enum ManagedEnum 
{ 
    Enum1, 
    Enum2 
} 

這是由一個C訪問++/CLI包裝類和枚舉:

enum NativeEnum 
{ 
    Enum1, 
    Enum2 
}; 

class WrapperClass 
{ 
public: 
    WrapperClass(ManagedNamespace::MyManagedClass^ inManaged): 
    _Managed(inManaged) 
    {} 

    NativeEnum GetEnumValue() 
    { 
    return (NativeEnum)_Managed->EnumValue; 
    } 

private: 
    gcroot<ManagedNamespace::MyManagedClass^> _Managed; 
}; 

現在,只要在C#類和C#枚舉在同一個組件,這工作正常。

但如果C#枚舉在不同的C#組件中,C#類仍然建立罰款,但試圖編譯C++類產生的錯誤:

error C2440: 'type cast' : cannot convert from 'OtherNamespace::ManagedEnum' to 'OtherNamespace::NativeEnum' 
1>   Conversion requires a constructor or user-defined-conversion operator, which can't be used by const_cast or reinterpret_cast 

回答

1

在試用Aaron P的答案時,我發現問題在於我的C++項目沒有將枚舉作爲參考的C#程序集。一旦我添加了引用,它一切正常。

+0

您應該將其標記爲答案。 – t3chb0t

1

嘗試獲得潛在價值,然後轉換爲本地枚舉。

這是一種粗糙的做法,但在您的情況下可能就足夠了。

NativeEnum someMethod(ManagedEnum myEnum) 
{ 
    return (NativeEnum)(int)myEnum; 
} 

另一種方法是創建一個採用兩種類型和託管枚舉輸入的本機模板方法,並返回本機類型。在這種情況下,您必須使用反射來確定託管枚舉的基礎類型。

+0

這不提供問題的答案。要批評或要求作者澄清,在他們的帖子下留下評論 - 你總是可以評論你自己的帖子,一旦你有足夠的[聲譽](http://stackoverflow.com/help/whats-reputation),你會能夠[評論任何帖子](http://stackoverflow.com/help/privileges/comment)。 –

+0

對不起,我是新來張貼在這裏,正在編輯帖子,因爲你在評論它... –

+0

是你的判斷,因爲我如何措辭原來的句子? –