我有一个C#课程:
public class MyManagedClass
{
public ManagedEnum EnumValue {get; set;}
}
使用C#enum
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
答案 0 :(得分:1)
尝试导出基础值,然后转换为本机枚举。
这是一种粗暴的做法,但在你的情况下可能就足够了。
NativeEnum someMethod(ManagedEnum myEnum)
{
return (NativeEnum)(int)myEnum;
}
另一种方法是创建一个本机模板方法,同时获取两种类型和托管枚举输入,并返回本机类型。在这种情况下,您必须使用反射来确定托管枚举的基础类型。
答案 1 :(得分:1)
在尝试Aaron P的回答时,我发现问题在于我的C ++项目没有C#程序集,其中的枚举作为参考。一旦我添加了该引用,它一切正常。