我正试图找到一种方法来统一处理枚举,但我找不到让它工作的方法。假设我有几个枚举声明如下:
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作为一个非常简单的例子来说明问题,而不是如何从类型中获取名称。基本上我想要一个方法,我可以传递任何枚举,让它直接作用于该枚举,谢谢
答案 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。