如何在Xamarin中正确绑定含多属性的Java枚举?
Xamarin绑定带多属性Java枚举的解决方案
问题背景
你需要绑定的Java枚举定义如下:
public enum WriteType { WITH_RESPONSE(WRITE_TYPE_DEFAULT, PROPERTY_WRITE), WITHOUT_RESPONSE(WRITE_TYPE_NO_RESPONSE, PROPERTY_WRITE_NO_RESPONSE), SIGNED(WRITE_TYPE_SIGNED, PROPERTY_SIGNED_WRITE); public final int writeType; public final int property; WriteType(final int writeType, final int property) { this.writeType = writeType; this.property = property; } }
绑定编译时Visual Studio将其生成为类,但构造器被识别为返回int类型的同名方法,触发错误:
CS0542 'WriteType': member names cannot be the same as their enclosing type
解决方法
通过Xamarin绑定项目的Metadata.xml文件修改绑定规则,调整构造器和属性的生成逻辑:
- 在绑定项目的
Transforms目录下,找到Metadata.xml(如果没有则新建) - 添加以下配置,替换其中的
你的包名为枚举实际所在的Java包路径:
<metadata> <!-- 重命名构造器,避免与类名冲突 --> <attr path="/api/package[@name='你的包名']/enum[@name='WriteType']/constructor" name="managedName">_ctor</attr> <!-- 为属性重命名,符合C#命名规范 --> <attr path="/api/package[@name='你的包名']/enum[@name='WriteType']/field[@name='writeType']" name="managedName">WriteTypeValue</attr> <attr path="/api/package[@name='你的包名']/enum[@name='WriteType']/field[@name='property']" name="managedName">PropertyValue</attr> </metadata>
原理说明
Java中带自定义构造器和属性的枚举,在Xamarin默认绑定逻辑中会被转换为C#类而非枚举。通过Metadata.xml的指令:
- 重命名构造器规避同名冲突错误
- 调整属性名称适配C#编码习惯
- 保留原枚举的所有实例和属性功能
内容的提问来源于stack exchange,提问作者alsaleem
相关产品推荐
相关产品推荐

