2008-11-14 76 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

相關問題