【问题标题】:How to set a string to an enum variable? [duplicate]如何将字符串设置为枚举变量? [复制]
【发布时间】:2012-01-23 14:14:57
【问题描述】:

可能重复:
Cast string to enum with enum attribute

我有一个这样的enum

public enum IddFilterCompareToCurrent
{
    [StringValue("Ignore")]
    Ignore,
    [StringValue("Pre-Post")]
    PrePost,
    [StringValue("Custom")]
    Custom
}

我还有一些 DomainUpDown 控件填充了我定义的枚举的相同值,除了因为枚举不接受 - 字符,我必须使用 Attributes 将它们与 DomainUpDown 内容匹配.

现在我的问题是如何将 domainupdown 的选定项插入到该枚举类型的变量中?

类似:

private IddFilterCompareToCurrent myEnum = Enum.Parse(typeof(IddFilterCompareToCurrent), domainUpDown1.SelectedItem.ToString());

我收到此错误:

无法将类型“object”隐式转换为“Filtering.IddFilterCompareToCurrent”。存在显式转换(您是否缺少演员表?)

【问题讨论】:

  • @Mikant:确实如此。为什么你认为不是?
  • 对不起,你是对的。只是看错了标签。

标签: c# .net string enums


【解决方案1】:

这样做:

private IddFilterCompareToCurrent myEnum = 
(IddFilterCompareToCurrent )Enum.Parse(typeof(IddFilterCompareToCurrent ),domainUpDown1.SelectedItem.ToString());

Enum.Parse 返回一个Object,所以你需要转换它。

【讨论】:

  • 这无济于事。现在,只要属性值与枚举值名称不匹配,它就会在运行时导致异常。
  • @DanielHilgarth:修复它。复制/粘贴错误。谢谢
  • 我没有看到您所做的更改,但此更改并未解决问题。请查看重复评论中链接到的问题中接受的答案。
  • 谢谢,它可以工作...我正在使用 domainupdown 控件中的固定字符串,所以如果我不犯任何错误,应该没有例外。
  • 是的,我看不出这如何解决连字符问题或显示名称中的其他任意文本。
【解决方案2】:

您需要为将读取StringValueAttribute 的枚举创建一个包装器对象

public class EnumWrapper<TEnum>
{
    public static EnumWrapper<TEnum>[] GetItems()
    {
        Type type = typeof(TEnum);
        var enumObjects = Enum.GetValues(type);
        var enumTyped = enumObjects.Select((v) => (TEnum)v);
        EnumWrapper<TEnum>[] ret = enumTyped.Select((e) => new EnumWrapper<TEnum>(e));

        return ret;
    }
}

public string DisplayName { get; private set; }
public TEnum  EnumValue { get; private set; }

private EnumWrapper(TEnum enumVal)
{
   Type type = enumVal.GetType();
   // Read attributes here. I'm leaving this out. if you need it, let me know.
   DisplayName = GetStringValueAttributeOfEnumValue(enumVal);
   EnumValue = enumVal;
}

【讨论】:

    【解决方案3】:

    需要解析出属性等于输入值的枚举的字段名的值:

    FieldInfo[] fields = typeof(IddFilterCompareToCurrent).GetFields();
                    foreach (FieldInfo fi in fields) 
                    {
                        object[] atts = fi.GetCustomAttributes(typeof(StringValueAttribute), false);
                        if (atts != null && atts.Length > 0) 
                        {
                            StringValueAttributeatt = atts[0] as StringValueAttribute;
                            if (att.Value == domainUpDown1.SelectedItem.ToString()) return (IddFilterCompareToCurrent)Enum.Parse(typeof(IddFilterCompareToCurrent), fi.Name);
                        }
                    }
    

    【讨论】:

      【解决方案4】:

      你能改变枚举并做这样的事情吗.. 如果你这样做,它将返回枚举的名称.. 否则 [StringValue("..") 的实际类是什么样的.. ?

          enum IddFilterCompareToCurrent 
          { 
      
              Ignore,     
              PrePost,
              Custom 
          } 
      
      usage: 
          var strEnumNames = Enum.GetNames(typeof(IddFilterCompareToCurrent));
      

      返回一个字符串[] "Ignore","PrePost","Custom";

       if you have this already working please ignore.. 
      

      【讨论】:

        猜你喜欢
        • 2023-04-09
        • 2012-01-03
        • 2016-06-27
        • 1970-01-01
        • 2011-07-02
        • 1970-01-01
        • 2017-05-01
        • 2015-12-19
        • 2017-10-13
        相关资源
        最近更新 更多