C# 泛型枚举约束

C# 泛型枚举约束,c#,generics,enums,C#,Generics,Enums,我继承了一个web api,它在代码中定义了很多枚举,我想将它们转换为一个名为EnumView的视图模型类,这样它们就可以序列化,如下所示 {Id:value,Name:enumName} 在将泛型类限制为枚举类型时,我得到了警告 约束不能是特殊类“System.Enum” 这是我将要使用的通用转换器 public class EnumViewConverter<T> where T : Enum { public static List<EnumView> Co

我继承了一个web api,它在代码中定义了很多枚举,我想将它们转换为一个名为EnumView的视图模型类,这样它们就可以序列化,如下所示

{Id:value,Name:enumName}

在将泛型类限制为枚举类型时,我得到了警告

约束不能是特殊类“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;
    }
}
公共类EnumViewConverter,其中T:Enum
{
公共静态列表ConvertToView()
{
列表枚举视图=新列表();
T[]enumValues=(T[])Enum.GetValues(typeof(T));
foreach(枚举值中的变量枚举值)
{
var enumView=新的enumView
{
Id=(int)枚举值,
Name=Enum.GetName(typeof(T),enumValue)
};
enumView.Add(enumView);
}
返回视图;
}
}
如果不将T约束到枚举,则不会编译以下转换

Id=(int)枚举值


由于缺少通用枚举约束,最好的解决方法是什么?

您可以使用:Id=Convert.ToInt32(enumValue)而不是强制转换(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;
    }
}
公共静态类EnumViewConverter,其中T:struct
{
公共静态列表ConvertToView()
{
如果(!typeof(T).IsEnum)抛出新的ArgumentException(“T必须是枚举类型”);
列表枚举视图=新列表();
T[]enumValues=(T[])Enum.GetValues(typeof(T));
foreach(枚举值中的变量枚举值)
{
var enumView=新的enumView
{
Id=转换为32(枚举值),
Name=Enum.GetName(typeof(T),enumValue)
};
enumView.Add(enumView);
}
返回视图;
}
}
打电话给

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

感谢所有的帮助,我可以发誓我之前已经尝试过了:(

要扩展我之前的评论,中描述的技术使用一个嵌套类,该类具有依赖于其父类的泛型参数,以模拟泛型
枚举
约束。您可以在此处使用此方法:

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> { }
公共抽象类转换器classutils
TClass:类在哪里
{
公共类ViewConverter,其中TInner:struct,TClass
{
公共静态列表ConvertToView()
{
列表枚举视图=新列表();
TInner[]enumValues=(TInner[])Enum.GetValues(typeof(TInner));
foreach(枚举值中的变量枚举值)
{
var enumView=新的enumView
{
Id=(int)(对象)枚举值,
Name=Enum.GetName(typeof(TInner),enumValue)
};
enumView.Add(enumView);
}
返回视图;
}
}
}
公共类EnumConverter:ConverterClassUtils{}
然后编译以下代码:

var view = EnumConverter.ViewConverter<SomeEnum>.ConvertToView();
var view=EnumConverter.ViewConverter.ConvertToView();
但这并不是:

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

好的,您有一个已定义的枚举,但是您将如何使用它?通过回答这个问题,我们可以找到转换的目的,然后我们可以提出一个solution@leppie-我在发布之前已经阅读了该问题/答案,但并不觉得它真的回答了我的问题。@Hamed不太确定你想要的是什么-EnumView是在API中序列化。枚举用于服务器端代码…实际上
(int)我猜enumValue
不会编译。因为不能保证
enumValue
必须是
int
。顺便说一句,
Enum
也可以序列化。@AmitKumarGhosh Yep,如果我使用where t:struct,类型t不保证是枚举。我想创建一个包含所有枚举值的列表,并在API中返回它,而不是只需序列化一个枚举值。谢谢,我以为我已经测试过了,但它不起作用;不管怎样,再试一次,你就成功了。谢谢你扩展了你的建议,最后我使用了下面的代码,因为它更简单。谢谢你的帮助。
var view = EnumConverter.ViewConverter<int>.ConvertToView();