Tob*_*oby 2 c# extension-methods iis-6 casting visual-studio-2008
我有一段C#代码,它按类型将枚举值添加到下拉列表中.它要求在T1为枚举类型的情况下调用它,尽管我不能将其指定为类型约束,因为枚举是特殊情况,这是不可能的.这不是主要问题,因为它仅在内部使用并记录在案.
Description是System.Enum的扩展,它返回枚举值的DescriptionAttribute的值或值的ToString(如果未指定).
因此,我必须在LINQ语句的Cast部分中转换为System.Enum而不是T1,否则说明扩展不可用.
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());
}
Run Code Online (Sandbox Code Playgroud)
这很好,适用于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.<SelectIterator>d__d
2.MoveNext().缓冲区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()运行的方式.有关详细信息,请参阅这些帖子
归档时间: |
|
查看次数: |
551 次 |
最近记录: |