有没有办法可以通过序列中的数字得到Enum值?

时间:2017-07-09 09:36:04

标签: c# xamarin enums xamarin.forms

我有这个枚举:

public enum PTI
{
    UserInput = 0,
    Five = 5,
    Ten = 10,
    Fifteen = 15
}

public static partial class Extensions
{
    public static string Text(this PTI time)
    {
        switch (time)
        {
            case PTI.UserInput: return "User Input";
            case PTI.Ten: return "10 seconds";
            case PTI.Five: return "5 seconds";
            case PTI.Fifteen: return "15 seconds";
        }
        return "";
    }
}

这是一个简单的案例,但我以它为例。在我的代码中,我需要将枚举的值传递给函数,所以我想出了这个:

if (selectedIndex == 1) App.DB.UpdateSetting(Settings.Pti, PTI.UserInput);
if (selectedIndex == 2) App.DB.UpdateSetting(Settings.Pti, PTI.Five);
if (selectedIndex == 3) App.DB.UpdateSetting(Settings.Pti, PTI.Ten);
if (selectedIndex == 4) App.DB.UpdateSetting(Settings.Pti, PTI.Fifteen);

它并不理想。也许一个案例会有帮助,但我的观点是我得到的是一个从1到4的数字,从中我需要得到ENUM值。

在没有if或case构造的情况下,我是否可以通过某种方式从selectedIndex的值中获取ENUM值?

背景 - 这里是selectedIndex的值来自的地方。它来自Xamarin Form XAML的选择器

<Picker x:Name="ptiPicker" IsVisible="false" SelectedIndexChanged="ptiOnPickerSelectedIndexChanged">
                                            <Picker.Items>
                                                <x:String>User input</x:String>
                                                <x:String>5 seconds</x:String>
                                                <x:String>10 seconds</x:String>
                                                <x:String>15 seconds</x:String>
                                            </Picker.Items>
                                        </Picker>

注意:

如果有可能,我很乐意为枚举添加一些扩展方法,如果这有助于获得我需要的东西。只是不知道该怎么做。

4 个答案:

答案 0 :(得分:2)

您正在尝试获取Enum值的索引。

// Below code sample how to find the index of Enum.
// Sample to show how to find the index of item
PTI p = PTI.Ten; 
int index = Array.IndexOf(Enum.GetValues(p.GetType()), p);
Console.WriteLine(index); // Output: 2 because of value PTI.Ten

所以,最后解决方案是用一个语句替换所有if语句。

PTI pti = (PTI)(Enum.GetValues(typeof(PTI))).GetValue(selectedIndex-1); // selectedIndex-1 because the index is 0 based.
App.DB.UpdateSetting(Settings.Pti, pti);

答案 1 :(得分:1)

您可以像在此程序中一样使用PTI转换int

public class Program
{
    public static void Main(string[] args)
    {

        //Your code goes here
        Console.WriteLine(""+(PTI)2);
        Console.WriteLine(""+(PTI)5);
    }
}

public enum PTI
{
    UserInput = 0,
    Five = 5,
    Ten = 10,
    Fifteen = 15
}

如果整数在枚举中存在有效值,则获得枚举,否则,您将获得整数不变,因为上面的程序结果如下所示:

2
Five

答案 2 :(得分:1)

我对Xamarin不熟悉,但您可能应该尝试直接用枚举元素填充项目吗? 在WPF中就像这样。如果要将枚举元素转换为字符串和返回,可以使用ValueConverter 以下示例为来自 WPF

        <ComboBox
        // properties here
        SelectedItem="{Binding SelectedItem.EngineType, UpdateSourceTrigger=PropertyChanged}">
        <Model:EEngineType>Diesel</Model:EEngineType>
        <Model:EEngineType>Gas</Model:EEngineType>
        <Model:EEngineType>Biofuel</Model:EEngineType>
        <Model:EEngineType>Electrical</Model:EEngineType>
    </ComboBox>

和EEngineType

public enum EEngineType
{
    Diesel,
    Gas,
    Biofuel,
    Electrical
}

可能你应该环顾这样的事情,所以你不需要转换任何东西,只需将selectedItem传递给你的方法。

换句话说,你可以尝试使用这样的东西

readonly TCollection _PITCollection;
// ctor here
 _PITCollection = new TCollection<PIT> { PIT.UserInput, PIT.Five, PIT... };

您可以编写任何所需的集合类型而不是TCollection。 而且你可以使用绑定和调用

App.DB.UpdateSetting(Settings.Pti, myPicker.SelectedItem);

或者您可以使用以前的风格并致电

App.DB.UpdateSetting(Settings.Pti, _PITCollection[selectedIndex]);

希望这会对你有所帮助

答案 3 :(得分:0)

您可以尝试将其转换为整数以获取值。

Convert.ToInt32(PTI.Fifteen)

enter image description here

Picker items的格式为string所以您可以做的是获取您的选择器selected index的文本并将其解析为仅从项目中获取数字。< / p>

picker.Items [picker.SelectedIndex];

e.g。

var selectedValue = "15 seconds"; //this will be your selected value in picker
var splitx = selectedValue.Split(' ');

Console.WriteLine(Convert.ToInt32(PTI.Fifteen));

if (Convert.ToInt32(splitx[0]) == Convert.ToInt32(PTI.Fifteen))
{
    Console.WriteLine("selected value is - 15 seconds");
}

enter image description here

您也可以尝试在Xamarin example here

中执行Dictionary

希望这可以帮助你...