泛型枚举约束

我已经继承了一个web API,它有很多代码中定义的枚举,我想将它们转换为名为EnumView的视图模型类,以便它们可以如下所示序列化...

{Id:value,Name:enumName}

public class EnumView
{
    public int Id { get; set; }
    public string Name { get; set; }
}

将泛型类限制为枚举类型后,我得到警告

约束不能是特殊的类'System.Enum'

这是我正在使用的通用转换器...

public class EnumViewConverter<T> where T : Enum
{
    public static List<EnumView> ConvertToView()
    {
        List<EnumView> enumViews = new List<EnumView>();

        T[] enumValues = (T[])Enum.GetValues(typeof(T));

        foreach (var enumValue in enumValues)
        {
            var enumView = new EnumView
            {
                Id = (int)enumValue,
                Name = Enum.GetName(typeof(T), enumValue)
            };

            enumViews.Add(enumView);
        }
        return enumViews;
    }
}

没有T被限制为一个枚举,下面的转换不会编译...

Id =(int)enumValue,

由于缺乏泛型约束的问题,最好的方法是什么?


你可以使用:Id = Convert.ToInt32(enumValue)而不是cast(int)

如果你想添加一些'约束'来检查编译时的类型,你可以设置'where T:struct',它至少可以防止设置类的类型。


最后我用...

public static class EnumViewConverter<T> where T : struct
{
    public static List<EnumView> ConvertToView()
    {
        if (!typeof(T).IsEnum) throw new ArgumentException("T must be an enumerated type");

        List<EnumView> enumViews = new List<EnumView>();

        T[] enumValues = (T[])Enum.GetValues(typeof(T));

        foreach (var enumValue in enumValues)
        {
            var enumView = new EnumView
            {
                Id = Convert.ToInt32(enumValue),
                Name = Enum.GetName(typeof(T), enumValue)
            };

            enumViews.Add(enumView);
        }
        return enumViews;
    }
}

由......调用

var views = EnumViewConverter<FooBarEnum>.ConvertToView();

感谢所有的帮助,可以发誓我早些时候试过:(


为了扩大在我先前的评论,在这个答案中描述的技术使用嵌套类依赖于它的父类中的泛型参数效仿通用Enum约束。 你可以在这里使用这种方法:

public abstract class ConverterClassUtils<TClass> 
    where TClass : class
{
    public class ViewConverter<TInner> where TInner : struct, TClass
    {
        public static List<EnumView> ConvertToView()
        {
            List<EnumView> enumViews = new List<EnumView>();

            TInner[] enumValues = (TInner[])Enum.GetValues(typeof(TInner));

            foreach (var enumValue in enumValues)
            {
                var enumView = new EnumView
                {
                    Id = (int)(object)enumValue,
                    Name = Enum.GetName(typeof(TInner), enumValue)
                };

                enumViews.Add(enumView);
            }
            return enumViews;
        }
    }
}

public class EnumConverter : ConverterClassUtils<Enum> { }

那么下面编译:

var view = EnumConverter.ViewConverter<SomeEnum>.ConvertToView();

虽然这不:

var view = EnumConverter.ViewConverter<int>.ConvertToView();
链接地址: http://www.djcxy.com/p/54421.html

上一篇: Generic enum constraint

下一篇: C# How to check an enum value is passed in a parameter?