今天当我尝试将一些现有代码从.net移植到Xamarin(Mono for Android)时,我遇到了[MethodImpl(MethodImplOptions.AggressiveInlining)]没有为Android编译的问题,因为MethodImplOptions没有AggressiveInlining值在为Android编译时。
我想知道是否可以在不更改所有代码行的情况下编译此代码?
我已经尝试创建一个具有相同名称的属性,但也遇到了编译错误,因为2个枚举具有相同的名称(ambigious)。
我想要的是在现有的枚举中注入AggressiveInlining值的一些方法,只需给它一个0或类似的值,这样就没有任何反应。
我希望有人可以帮我解决这个问题。
亲切的问候,
Devedse
答案 0 :(得分:1)
AFAIK,您无法为枚举添加值;该类型已编译到库中。 (你可以通过将基础类型值转换为枚举值来将它们设置为其他值,但我不认为这适用于您的属性情况)
由于你有许多地方在使用它,你必须使用指令进行更新,我建议将所需的MethodImplOption
值移动到一个可集中访问的常量,并让所有内容引用:
public class MethodImplSetting
{
public const MethodImplOptions DEFAULT_METHOD_IMPL = MethodImplOptions.AggressiveInlining;
}
[MethodImpl(DEFAULT_METHOD_IMPL)]
public void MyMethod()
{
}
然后您可以应用编译器directives在编译时毫不费力地将其切换为您的特殊Android值:
public class MethodImplSetting
{
public const MethodImplOptions DEFAULT_METHOD_IMPL =
#if __ANDROID__
MethodImplOptions.NoInlining; //or whatever value you want
#else
MethodImplOptions.AggressiveInlining;
#endif
}
当您支持其他平台或想要切换不同的方法实现选项进行测试时,现在这样做变得微不足道。
我认为适当的Xamarin Android指令来自Platform Divergence/Abstraction/Divergent Implementation, section 3.1.2的文档__ANDROID__
,但您可能需要仔细检查一下。