具有强类型枚举类型的方法参数

时间:2010-09-25 19:11:24

标签: c#

考虑以下代码

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中的枚举类型?

4 个答案:

答案 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都包含可以向其发送错误数据的方法。

相关问题