【问题标题】:Parsing Enum to Enum when implementing FlagsAttribute实现 FlagsAttribute 时将 Enum 解析为 Enum
【发布时间】:2019-11-25 16:23:08
【问题描述】:

我有两个问题,一个来自另一个。

  1. 我正在尝试将具有FlagsAttribute 属性的枚举解析为另一个也具有相同属性的枚举。我的尝试在下面的代码中。如果有人找到了一种有效的方法,请告诉我。因为我当前的方法涉及迭代所有设置的标志并一一解析,然后将它们逻辑或运算在一起。
  2. 在尝试解决这个问题时,我收到了这个错误: The type 'Program.Test' cannot be used as type parameter 'T' in the generic type or method 'Program.Parse<T>(string, bool)'. There is no boxing conversion from 'Program.Test' to 'System.FlagsAttribute'. 我在这里真正要寻找的是对原因的解释。显然,两个枚举都有Flags 属性,它是FlagsAttribute 的简写,所以不应该已经存在转换吗?

还有懒人的链接:DotNetFiddle

代码:

public static void Main()
{
    var q = Parse<TestType>((Test.ACT | Test.SAT_2016).ToString());
    Console.WriteLine(string.Format("Type: {0}\t Value: {1}", q.GetType(), q));

    // */

}

public static T Parse<T>(string value, bool ignoreCase = false)
    where T : FlagsAttribute , IComparable, IFormattable, IConvertible
{
    if (value.ToString().Contains(",")){
        var parts = value.ToString().Split(',');
        var results = new List<T> ();
        var final = default(T);

        foreach (var part in parts){
            try {
                final |= (T)Enum.Parse(typeof(T), part, ignoreCase) ;
            }catch (Exception e){
                Console.WriteLine("Got exception");
                /* Supressed */
            }
        }
        return final;

    }else{
        return (T) Enum.Parse(typeof(T), value.ToString(), ignoreCase);
    }
}
[Flags]
public enum Test{
    ACT = 32,
    SAT_2016 = 65536,
};
[Flags]
public enum TestType {
    ACT = 4,
    SAT_2016 = 39,
};

【问题讨论】:

  • 你也可以试试 where T : new() 放宽一般限制。不过,我不确定这是否是您所需要的。
  • 您不必在value 上调用ToString,因为它已经是string。此外,您可以使用拆分字符串的代码而不是检查逗号,因为即使没有逗号也可以工作(它将返回一个仅包含原始字符串的数组)。如果不是,则在解析不包含逗号的值时不会捕获潜在异常。

标签: c# enums attributes .net-4.7.2


【解决方案1】:

你的枚举有[Flags]属性;它不会从FlagsAttribute继承 - 所以只需删除T : FlagsAttribute 约束。

在 C# 7.3 或更高版本中,您可以直接使用where T : Enum 约束;无法在泛型约束中表达“具有特定属性” - 您必须在运行时通过反射进行检查。

【讨论】:

  • 这会处理异常,我想它没有实现FlagsAttribute 类是有道理的,但这仍然不允许我从逻辑上或将结果放在一起。由于我不在 C# 7.3 上,我已将 FlagsAttribute 替换为我最初使用的结构。
猜你喜欢
  • 2022-01-06
  • 2012-05-02
  • 1970-01-01
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多