考虑以下代码
enum HorizontalAlignment { Left, Middle, Right };
enum VerticleAlignment { Top, Middle, Bottom };
function OutputEnumValues (Type enumType)
{
foreach (string name in Enum.GetNames(typeof(enumType)))
{
Console.WriteLine(name);
}
}
可以称之为
OutputEnumValues (typeof(HorizontalAlignment));
OutputEnumValues (typeof(VerticleAlignment ));
但我可以无意中打电话,例如
OutputEnumValues (typeof(int));
这将编译但在运行时在Enum.GetNames()
失败编写方法签名以在编译时捕获此类问题的任何方式 - 即只接受OutputEnumValues中的枚举类型?
答案 0 :(得分:4)
每个枚举类型只是一个整数(可以是8位,16位,32位或64位,有符号或无符号)。您可以将整数0
强制转换为任何枚举类型,它将成为静态类型为枚举的值。
此外,您可以使用类型为Enum
的参数,以确保只传入枚举值,而不知道实际的枚举类型。
因此,我的解决方案如下:
public static void OutputEnumValues(Enum example)
{
foreach (string name in Enum.GetNames(example.GetType()))
{
Console.WriteLine(name);
}
}
然后:
OutputEnumValues((HorizontalAlignment) 0);
OutputEnumValues((VerticalAlignment) 0);
这适用于所有枚举类型,无论其基础整数类型如何。
答案 1 :(得分:1)
我不认为在C#中这是可能的。
您可以在Enum上使用扩展方法,但这需要您在实例上调用它而不是类型本身,这可能是不可取的。
使用泛型的替代解决方案可以帮助您解决结构:
public static void OutputValues<T>() where T : struct
{
if (!typeof(T).IsEnum)
throw new NotSupportedException("Argument must be an enum.");
// code here...
}
如果您尝试使用类调用它,但如果使用不是Enum的结构调用它,则会产生运行时错误,这将产生编译时错误。
答案 2 :(得分:1)
你真正想要的是一个可以约束到枚举类型的通用方法。但是,这在C#中是不可能的。
Jon Skeet在这个帖子中找到了这个问题的答案:Anyone know a good workaround for the lack of an enum generic constraint?
对于您的方法,您真正想要的是
public void OutputEnumValues<T>() where T : HorizontalAlignment
{
foreach (string name in Enum.GetNames(typeof(T)))
{
Console.WriteLine(name);
}
}
但是除非你使用Jon的建议,否则这种约束是行不通的。
答案 3 :(得分:0)
我没有看到你所说的“问题”。
您可以定义获取Type对象的方法。对于客户来说,任何类型似乎都足够了。但是,您假设该参数实际上是枚举。错误在你的方法本身。无论如何,这个方法本身都是设计的,所以用这样的代码来理解你实际上想要解决的问题是不可能的。
然后,您的方法的名称使得参数应该是枚举值非常明显。你可以考虑一个合同,如果代码的客户违反了合同,那么他们的面孔就会爆炸。任何API都包含可以向其发送错误数据的方法。