2

我有一段 C# 代码将枚举的值按类型添加到下拉列表中。它要求调用它时 T1 是枚举类型,尽管我不能将其指定为类型约束,因为枚举是不可能的特殊情况。这不是主要问题,因为这仅在内部使用并记录在案。

Description 是 System.Enum 的扩展,它返回枚举值的 DescriptionAttribute 的值,如果未指定,则返回值的 ToString。

因此,我必须在 LINQ 语句的 Cast 部分转换为 System.Enum,而不是转换为 T1,否则 Description 扩展不可用。

public static void AddEnum<T1>(this System.Web.UI.WebControls.DropDownList me)
{
    Type t = Enum.GetUnderlyingType(typeof(T1));
    var l = Enum.GetValues(typeof(T1))
                .Cast<System.Enum>()
                .Select(x => new ListItem(x.Description(),
                                          Convert.ChangeType(x, t)
                                                 .ToString()));
    me.Items.AddRange(l.ToArray());
}

这很好,在 Visual Studio 2008 的 Web 开发服务器中工作,但在 IIS 6 上运行时失败并出现强制转换异常。它使用不变的硬编码枚举作为填充 ASP 页面的类型参数运行。

System.InvalidCastException:从 '%namespace.class+nameofenum%' 到 'System.Enum' 的无效转换。在 System.Convert.DefaultToType(IConvertible value, Type targetType, IFormatProvider provider) at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider) at System.Linq.Enumerable.d__b0 1.MoveNext() at System.Linq.Enumerable.<SelectIterator>d__d2.MoveNext() 在 System.Linq。 Buffer 1..ctor(IEnumerable1 source) at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source) at AddEnum[T1](DropDownList me)

(命名空间/类名被我掩盖了)

我无法在其他版本的 IIS 上对其进行测试,但开发版本与生产系统不匹配似乎很奇怪。有人知道为什么是这样吗?

4

1 回答 1

5

在黑暗中拍摄。其中一个平台运行 3.5 RTM,另一个运行 3.5 SP1。如果是这样,您很可能会遇到 3.5SP1 中引入的破坏性更改,该更改改变了 .Cast() 的操作方式。有关更多详细信息,请参阅这些帖子

于 2008-11-14T02:49:50.247 回答