【问题标题】:Convert string array to enum on the fly即时将字符串数组转换为枚举
【发布时间】:2012-11-30 06:46:36
【问题描述】:

我将enum 绑定到这样的属性网格:

public enum myEnum
{
    Ethernet,
    Wireless,
    Bluetooth
}

public class MyClass
{
    public MyClass()
    {
        MyProperty = MyEnum.Wireless;
    }

    [DefaultValue(MyEnum.Wireless)]
    public MyEnum MyProperty { get; set; }
}

public Form1()
{
    InitializeComponent();
    PropertyGrid pg = new PropertyGrid();
    pg.SelectedObject = new MyClass();
    pg.Dock = DockStyle.Fill;
    this.Controls.Add(pg);
}

我的问题:我在程序运行时即时获取数据。我读取了网络适配器,然后将适配器名称存储到myArray,如下所示:

string[] myArray = new string[] { };
myArray[0] = "Ethernet";
myArray[1] = "Wireless";
myArray[2] = "Bluetooth";

是否可以使用 c# 即时将 myArray 转换为 myEnum?谢谢。

【问题讨论】:

  • 您错误地分配了 myArray[] 值,为什么要对 Enum 值进行硬编码..?

标签: c# arrays winforms enums propertygrid


【解决方案1】:

当然!这就是你所需要的:

IEnumerable<myEnum> items = myArray.Select(a => (myEnum)Enum.Parse(typeof(myEnum), a));

【讨论】:

  • 其实你需要转换IEnumerable&lt;myEnum&gt; items = myArray.Select(a =&gt; (myEnum) Enum.Parse(typeof (myEnum), a)); 否则你会得到一个编译器错误因为 Enum.Parse() 返回一个对象
【解决方案2】:

如果您的源数据不是完全可靠的,您可能需要考虑只转换可以实际解析的项目,使用TryParse()IsDefined()

可以通过以下代码从字符串数组中获取 myEnums 数组:

myEnum [] myEnums = myArray
    .Where(c => Enum.IsDefined(typeof(myEnum), c))
    .Select(c => (myEnum)Enum.Parse(typeof(myEnum), c))
    .ToArray();

请注意,IsDefined() 仅适用于单个枚举值。如果您有 [Flags] 枚举,则组合无法通过测试。

【讨论】:

    【解决方案3】:

    你会想要使用Enum.Parsehttp://msdn.microsoft.com/en-us/library/essfb559.aspx

    MyProperty = (myEnum)Enum.Parse(typeof(myEnum), myArray[0]);

    我猜你想如何将它与你的数组一起使用取决于你的需要。

    编辑:无论如何,首先将您的适配器名称作为枚举存储到您的数组中是否可行?数组必须是字符串有什么原因吗?

    【讨论】:

    • 我想将 myArray 绑定到属性网格,myArray 看起来像属性网格上的列表框,与将枚举类型绑定到属性网格时相同。这就是我想将数组转换为枚举的原因。
    • 当你绑定一个数组myEnum[] myArray = new [] {myEnum.Ethernet, myEnum.Wireless, myEnum.Bluetooth};时会发生什么?
    • 问题,枚举类型从来不存在。我在程序运行时获取数据适配器名称,然后将其存储到字符串数组中。如果字符串数组绑定到属性网格,将在属性网格上显示一个字符串集合编辑器,而我希望在属性网格上显示为一个列表框。这就是我想将字符串转换为枚举类型的原因。
    【解决方案4】:

    如果您想获取枚举值的名称,则不必使用 Parse。不要使用.ToString(),而是使用它。例如,如果我想返回 Ethernet,我会执行以下操作:

    public enum myEnum
    {
        Ethernet,
        Wireless,
        Bluetooth
    }
    

    在你的主类中添加这行代码:

    var enumName = Enum.GetName(typeof(myEnum), 0); //Results = "Ethernet"
    

    如果你想枚举枚举值,你可以这样做来获取值:

    foreach (myEnum enumVals in Enum.GetValues(typeof(myEnum)))
    {
        Console.WriteLine(enumVals);//if you want to check the output for example
    }
    

    【讨论】:

      【解决方案5】:

      在循环中为数组中的每个元素使用Enum.Parse

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-27
        • 2010-10-03
        • 1970-01-01
        • 2018-07-07
        • 1970-01-01
        • 2014-03-18
        • 2015-06-10
        相关资源
        最近更新 更多