Xamarin Android将Java.Lang.Enum映射到C#Enum

Dr.*_*ABT 4 xamarin.android xamarin

在java中我有枚举

package com.acme.common;

// In java world
public enum FooEnum {
    AValue,
    AnotherValue
}
Run Code Online (Sandbox Code Playgroud)

这在Java的整个代码中使用,例如

// In java world
public class Bar {
    void setFoo(FooEnum value) { 
       // ...  
    }
}
Run Code Online (Sandbox Code Playgroud)

这将被映射到C#中的一个类,该类继承Java.Lang.Enum,如下所示:

// Now in C# generated bindings 
// I want this to be a CLR Enum instead
public sealed partial class FooEnum : global::Java.Lang.Enum 
{ 
   // ... 
}   
// C# generated class uses Java.Lang.Enum type for getter and setter
// But I want FooEnum to be clr enum
public partial class Bar 
{        
   public FooEnum Foo { get; set; }
} 
Run Code Online (Sandbox Code Playgroud)

我想使用EnumFields.xml将它映射到C#枚举,但不知道如何.

我用Google搜索了Xamarin Android EnumFields并发现了一些结果,并且已经阅读了Xamarin Android Binding walthrough但仍不确定如何做到这一点......

Mat*_*att 5

首先,您已在EnumFields.xml中定义了它们在C#中的显示方式

<mapping jni-class="com/acme/common/FooEnum " clr-enum-type="Com.Acme.Common.FooEnum">
    <field jni-name="AValue" clr-name="AValue" value="0" />
    <field jni-name="AnotherValue" clr-name="AnotherValue" value="1" />
</mapping>
Run Code Online (Sandbox Code Playgroud)

然后,您需要为使用此枚举的所有方法编辑EnumMethods.xml

<mapping jni-class="com/skobbler/ngx/map/realreach/SKRealReachSettings">
    <method jni-name="getFoo" parameter="return" clr-enum-type="Com.Acme.Common.FooEnum" />
    <method jni-name="setFoo" parameter="measurementUnit" clr-enum-type="Com.Acme.Common.FooEnum" />
</mapping>
Run Code Online (Sandbox Code Playgroud)