我有一段 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__d
2.MoveNext() 在 System.Linq。 Buffer1..ctor(IEnumerable
1 source) at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source) at AddEnum[T1](DropDownList me)
(命名空间/类名被我掩盖了)
我无法在其他版本的 IIS 上对其进行测试,但开发版本与生产系统不匹配似乎很奇怪。有人知道为什么是这样吗?