将Enum视为通用?

时间:2012-02-15 17:48:06

标签: c# .net enums

我正试图找到一种方法来统一处理枚举,但我找不到让它工作的方法。假设我有几个枚举声明如下:

public enum ABC {
    One, 
    Two,
    Three
}

public enum DEF {
    Four,
    Five,
    Six
}

我想编写一个方法,将Enum作为参数,只返回枚举的名称,如下所示:

public string GetEnumName(Enum anEnum) {
    return anEnum.GetType().Name;
}

但如果我称之为GetEnumName(DEF);我得到'是一个被用作变量的类型'错误。有任何想法吗?感谢

编辑很抱歉,根据回复判断,我可能不够清楚。我只选择GetEnumName作为一个非常简单的例子来说明问题,而不是如何从类型中获取名称。基本上我想要一个方法,我可以传递任何枚举,让它直接作用于该枚举,谢谢

6 个答案:

答案 0 :(得分:3)

使用:

public static string GetTypeName<T>()
{
    return typeof(T).Name;
}

用法:

var result = GetTypeName<DEF>();

答案 1 :(得分:1)

您的问题是您传入的是System.Type而不是public string GetEnumName(Type enumType) { return enumType.Name; } 。将您的方法更改为:

{{1}}

答案 2 :(得分:1)

也许这会解决问题?

public static class EnumExtensions
{
    public static string GetEnumName<T>(this T value) where T : struct
    {
        var type = typeof(T);
        if (!type.IsEnum)
            throw new InvalidOperationException(string.Format("{0} is not an enum", type));
        return type.GetEnumName(value);
    }
}

答案 3 :(得分:1)

你想写的是这样的:

public string GetEnumName<T>() where T : Enum
{
    return typeof(T).Name;
}

即具有类型参数约束的通用方法。

不幸的是,没有办法在C#中为枚举定义这样的约束(也不可能为委托定义一个约束)。人们通常会选择@ananthonline提到的解决方案。

实际上,C#语言不支持此类约束,但CLR级别支持此约束。例如,使用Mono.Cecil之类的工具可以帮助您修改程序集并在编译完成后对方法应用约束。

查看这篇文章:Constraining generic constraints

您将找到一个工具,可以简化应用非C#支持的泛型类型参数约束的过程:Cecil constraint patcher

如果您想使用枚举成员的名称和值,请不要忘记Enum类上有很多有用的静态方法。

答案 4 :(得分:0)

只需传递类型:

public string GetEnumName(Type enumType)
{
    return enumType.Name;
}

并且

GetEnumName(typeof(ABC));

此时,如果您的方法不执行任何其他操作,则可能只需使用typeof(ABC).Name

答案 5 :(得分:0)

你不能。枚举类型(包括System.Enum)不允许使用通用约束。请改用Enum.GetName