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


我正在尝试将具有FlagsAttribute属性的枚举解析为另一个也具有相同属性的枚举。我的尝试在下面的代码中。如果有人找到了一种有效的方法,请告诉我。由于我当前的方法涉及迭代所有设置的标志,并一一解析,然后在逻辑上进行“或”运算。
在尝试解决此问题时,出现以下错误:
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,
};

最佳答案

您的枚举具有[Flags]属性;它不继承自FlagsAttribute-因此只需删除T : FlagsAttribute约束即可。

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

10-08 07:22