使用反射获取struct returns value__中的属性名

Using reflection to get attribute names in struct returns value__

我想用我的结构中的所有可用项目类型填充一个组合框 ItemTypes:

public enum ItemTypes
{
    Ore,
    Ice,
    Mineral,
    Pi
}

如果我最终必须添加一个项目类型(不太可能,但仍然可能发生),为了不在 2 个地方添加新项目类型,我想使用反射来填充该组合框,而不是手动添加每个列表中的项目类型。我是这样做的:

private void InitItemTypeComboBox()
{
    ComboBoxItemTypes = new List<String>();

    foreach (var itemType in typeof(EveItem.ItemTypes).GetFields())
    {
        ComboBoxItemTypes.Add(itemType.Name);
    }

    SelectedComboBoxItemType = ComboBoxItemTypes.ElementAt(0);
}

不幸的是,GetFields()itemType.Name 函数 return 不仅是我结构中的 4 种项目类型,它还 returns value__ 作为第一个字段,所以我的组合框中有一个我不想要的额外元素。

我试过同时使用 GetFields()BindingFlags.DeclaredOnlyBindingFlags.PublicBindingFlags.Instance 标志,但第一个 [=] 仍然是 return 17=] 我不想要的元素。

除了手动跳过由 typeof(EveItem.ItemTypes).GetFields() 编辑的第一个元素 return 之外,是否有其他方法可以指定我不想要此元素?

编辑:

如果它改变了什么,我的 ItemTypes 结构嵌套在我的另一个 public 类.

你应该使用:var t = typeof(ItemTypes).GetFields().Where(k => k.IsLiteral == true);

您可以使用 BindingFlags.Static(参见示例 http://goo.gl/w3VndT

所以

typeof(EveItem.ItemTypes).GetFields(BindingFlags.Static | BindingFlags.Public)

从枚举中获取值的最简单方法是使用内置 Enum.GetValues 方法。

https://msdn.microsoft.com/en-us/library/system.enum.getvalues%28v=vs.100%29.aspx