我有这个枚举:
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>
注意:
如果有可能,我很乐意为枚举添加一些扩展方法,如果这有助于获得我需要的东西。只是不知道该怎么做。
答案 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)
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");
}
您也可以尝试在Xamarin example here
中执行Dictionary
希望这可以帮助你...