2008-11-14 7 views
2

У меня есть кусок кода C#, который добавляет значения перечисления в выпадающий список по типу. Он требует, чтобы он вызывался с T1, являющимся типом перечисления, хотя я не могу указать это как ограничение типа, потому что перечисления - это особый случай, когда это невозможно. Это не является серьезной проблемой, поскольку это используется только внутри страны и документируется.C# casts отличается от VS2008 и IIS6

Описание является расширением System.Enum, которое возвращает значение атрибута DescriptionAttribute значения enum или ToString значения, если оно не указано.

Из-за этого я должен отдать в System.Enum в части Cast инструкции LINQ, а не в 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()); 
} 

Это нормально и работает в Студии 2008s сервера Визуальный веб-разработки, но не с исключением отлитого при запуске на IIS 6. Он запускается с неизменяемой, жёстко перечислимы в качестве параметра типа заселить ASP страниц.

System.InvalidCastException: Invalid литая из '% namespace.class + nameofenum%' в 'System.Enum'. на System.Convert.DefaultToType (IConvertible значение, тип TargetType, провайдера IFormatProvider) в System.Convert.ChangeType (Object значение, тип 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 [Т1] (DropDownList меня)

(пространство имен/с lassname скрыто мной)

Я не могу протестировать его на других версиях IIS, но кажется странным, что версия разработки не соответствует производственной системе. Кто-нибудь знает, почему это?

ответ

5

Выстрел в темноте. На одной из платформ работает 3.5 RTM, а на другой - 3.5 SP1. Если это так, вы, вероятно, столкнетесь с изменением, внесенным в 3.5SP1, которое изменило способ работы .Cast(). Посмотреть эти сообщения для более подробной информации

+0

Хорошей работы, они работают разные версии, но, к сожалению, мы не будем модернизировать производственную площадку в ближайшее время. Спасибо за помощь. – Toby 2008-11-14 03:28:41