我有一段C#代码,它按类型将枚举值添加到下拉列表中.它要求在T1为枚举类型的情况下调用它,尽管我不能将其指定为类型约束,因为枚举是特殊情况,这是不可能的.这不是主要问题,因为它仅在内部使用并记录在案.
Description是System.Enum的扩展,它返回枚举值的DescriptionAttribute的值或值的ToString(如果未指定).
因此,我必须在LINQ语句的Cast部分中转换为System.Enum而不是T1,否则说明扩展不可用.
public static void AddEnum(this System.Web.UI.WebControls.DropDownList me) { Type t = Enum.GetUnderlyingType(typeof(T1)); var l = Enum.GetValues(typeof(T1)) .Cast () .Select(x => new ListItem(x.Description(), Convert.ChangeType(x, t) .ToString())); me.Items.AddRange(l.ToArray()); }
这很好,适用于Visual Studio 2008s Web开发服务器,但在IIS 6上运行时失败并出现强制转换异常.它以不变的硬编码可枚举作为填充ASP页面的类型参数运行.
System.InvalidCastException:从'%namespace.class + nameofenum%'到'System.Enum'的转换无效.处于System.Linq.Enumerable.d__b0的System.Convert.ChangeType(对象值,类型conversionType,IFormatProvider提供程序)的System.Convert.DefaultToType(IConvertible值,类型targetType,IFormatProvider提供程序),System.Linq处的
1.MoveNext() at System.Linq.Enumerable.
2.MoveNext().缓冲区d__d 1..ctor(IEnumerable
1源)在AddEnum [T1]的System.Linq.Enumerable.ToArray [TSource](IEnumerable`1源)(DropDownList me)
(我掩盖的名称空间/类名)
我无法在其他版本的IIS上测试它,但是开发版本与生产系统不匹配似乎很奇怪.有人知道为什么吗?
在黑暗中拍摄.其中一个平台运行3.5 RTM,另一个运行3.5 SP1.如果是这样,你可能会遇到3.5SP1中引入的改变方式.Cast()运行的方式.有关详细信息,请参阅这些帖子
http://blogs.msdn.com/ed_maurer/archive/2008/02/16/breaking-change-in-linq-queries-using-explicitly-typed-range-variables.aspx
http://blogs.msdn.com/dinesh.kulkarni/archive/2008/08/10/net-fx-3-5-sp1-two-perf-improvements-linq-to-objects-and-linq-to- sql.aspx