我有一段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上测试它,但它似乎很奇怪开发版本与生产系统不匹配。有人知道为什么吗?
不错的工作,他们正在运行不同版本但不幸的是,我们不会很快提升生产现场。 感谢您的帮助。 – Toby 2008-11-14 03:28:41