2008-11-14 81 views
2

我有一段C#代码,它将enum的值按类型添加到下拉列表中。它要求用T1作为枚举类型来调用它,尽管我不能将它指定为类型约束,因为枚举是特殊情况,在这种情况下这是不可能的。这不是一个主要的问题,因为这只在内部使用并且有文件记录。在VS2008和IIS6之间有不同的C#类型转换

说明是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 2008s网络开发服务器工作,但是当IIS 6上运行它与不变运行,硬编码枚举作为类型的参数来填充ASP页失败,出现转换异常。

System.InvalidCastException:从 '%namespace.class + nameofenum%' 无效转换到 'System.Enum'。 在System.Convert.DefaultToType(IConvertible 值,类型TARGETTYPE, 的IFormatProvider提供商) 在System.Convert.ChangeType(对象 值,类型conversionType, 的IFormatProvider提供商) 在System.Linq.Enumerable.d__b0 1.MoveNext() at System.Linq.Enumerable.<SelectIterator>d__d 2。的MoveNext() 在System.Linq.Buffer 源) 在System.Linq.Enumerable.ToArray [TSource](IEnumerable`1 源) 在AddEnum [T1](DROPDOWNLIST我)

(命名空间/ C lassname被我遮挡)

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

回答

5

在黑暗中拍摄。其中一个平台运行3.5 RTM,另一个运行3.5 SP1。如果是这样,你可能会遇到3.5SP1中引入的改变方式.Cast()运行。查看这些信息了解更多详情

+0

不错的工作,他们正在运行不同版本但不幸的是,我们不会很快提升生产现场。 感谢您的帮助。 – Toby 2008-11-14 03:28:41

相关问题