0

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

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

有任何想法吗?

4

1 回答 1

0

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

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

这留下了上面的三个选择。

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

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

于 2013-10-24T19:31:01.443 回答