C#Enum.GetValues() - 使用非盒装对象

时间:2013-10-24 19:11:56

标签: c# enums boxing

我正在尝试编写一个泛型方法,它会在传递枚举时返回特定的标记。以下是已经减少到此问题所需的最低代码的方法。

    public static string GetMarkup(Type enumType)
    {
        StringBuilder builder = new StringBuilder();
        foreach (var val in Enum.GetValues(enumType))
        {
            builder.Append(val.ToString());
        }
        return builder.ToString();
    }

这样调用方法,其中CopyType是枚举:

    GetDropDownListHtml(typeof(CopyType))

目标是能够调用我为我将传递给此方法的枚举编写的ToString()扩展方法。问题是为了使方法具有通用性,我需要使用var在foreach声明中声明我的变量,但是将它包装起来。我有一个装箱的CopyType对象,而不是CopyType的枚举。

作为回应,我尝试了许多这样的想法,但无济于事:

    ((typeof(enumType))val.ToString()

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

无法使用扩展方法对特定枚举执行此操作。您需要扩展扩展方法以支持所有Enum类型,在那里添加is语句,您可以使用它只在必要时进行转换,或者为您调用的函数写一个特殊的重载只是为了这种类型的枚举。这与扩展方法的实际实现方式有关。

编译器将扩​​展方法转换为静态形式:myCopyType.ToString()在编译时变为CopyType.ToString(myCopyType)。但是根据您的场景(甚至是泛型),编译器无法确定要使用的类型,因为直到运行时才确定类型。

这留下了以上三个选择。

在我自己的代码中,我根据代码here选择了第一个选项。您可以在任何.GetLabel()类型上拨打Enum,并且可以专门为此特殊标签添加特殊标签。

此外,您还需要使用foreach (Enum val in ...,以确保编译器知道它是Enum