У меня есть фрагмент кода на C #, который добавляет значения перечисления в раскрывающийся список по типу. Он требует, чтобы он вызывался с типом перечисления T1, хотя я не могу указать это как ограничение типа, потому что перечисления являются особым случаем, когда это невозможно. Это не главная проблема, поскольку она используется только для внутренних целей и задокументирована.
Description - это расширение System.Enum, которое возвращает значение DescriptionAttribute значения enum или ToString значения, если оно не указано.
Из-за этого я должен привести к System.Enum в части Cast оператора LINQ, а не к 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 2008, но завершается неудачно с исключением приведения при запуске на IIS 6. Он запускается с неизменным, жестко перечисляемым перечисляемым параметром типа для заполнения страниц ASP.
System.InvalidCastException: неверное приведение из
"% 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 1..ctor(IEnumerable
1
источник)
в System.Linq.Enumerable.ToArray [TSource] (IEnumerable`1
источник)
в AddEnum [T1] (DropDownList me)
(пространство имен / имя класса скрыто мной)
Я не могу протестировать его на других версиях IIS, но кажется очень странным, что версия для разработки не соответствует производственной системе. Кто-нибудь знает, почему это так?