У меня есть кусок кода 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, но кажется странным, что версия разработки не соответствует производственной системе. Кто-нибудь знает, почему это?
Хорошей работы, они работают разные версии, но, к сожалению, мы не будем модернизировать производственную площадку в ближайшее время. Спасибо за помощь. – Toby 2008-11-14 03:28:41