C#为.net枚举添加额外的值

时间:2013-06-11 18:47:51

标签: c# reflection enums xamarin.android xamarin

今天当我尝试将一些现有代码从.net移植到Xamarin(Mono for Android)时,我遇到了[MethodImpl(MethodImplOptions.AggressiveInlining)]没有为Android编译的问题,因为MethodImplOptions没有AggressiveInlining值在为Android编译时。

我想知道是否可以在不更改所有代码行的情况下编译此代码?

我已经尝试创建一个具有相同名称的属性,但也遇到了编译错误,因为2个枚举具有相同的名称(ambigious)。

我想要的是在现有的枚举中注入AggressiveInlining值的一些方法,只需给它一个0或类似的值,这样就没有任何反应。

我希望有人可以帮我解决这个问题。

亲切的问候,

Devedse

1 个答案:

答案 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__,但您可能需要仔细检查一下。