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

本文关键字:对象 Enum GetValues | 更新日期: 2023-09-27 18:36:50

我正在尝试编写一个通用方法,该方法在传递枚举时将返回特定的标记。 以下是已简化为此问题所需的最低代码的方法。

    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()

有什么想法吗?

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

无法使用扩展方法来对特定枚举执行此操作。 你要么需要扩展扩展方法以支持所有Enum类型,在其中添加一个 is 语句,你可以只在必要时强制转换它,要么为此函数编写一个特殊的重载,你只为这种类型的枚举调用。 这与扩展方法的实际实现方式有关。

编译器将扩展方法转换为其静态形式:myCopyType.ToString()在编译时变得CopyType.ToString(myCopyType)。 但是对于你的方案(甚至泛型),编译器无法判断要使用哪种类型,因为类型直到运行时才能确定。

这就剩下上面的三个选择。

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

此外,您需要改用foreach (Enum val in ...,以确保编译器知道这是一个Enum