2008-11-14 7 views
2

J'ai un morceau de code C# qui ajoute les valeurs d'une énumération à une liste déroulante par type. Il faut qu'il soit appelé avec T1 étant un type enum, bien que je ne puisse pas spécifier cela comme une contrainte de type parce que enums est un cas spécial dans lequel cela n'est pas possible. Ce n'est pas une préoccupation majeure car ceci est seulement utilisé en interne et est documenté.Différences C# différant entre VS2008 et IIS6

Description est une extension sur System.Enum qui renvoie la valeur de l'attribut DescriptionAttribute de la valeur de l'énumération ou de la méthode ToString de la valeur si elle n'est pas spécifiée. Pour cette raison, je dois cast à System.Enum dans la partie Cast de l'instruction LINQ et non à T1 sinon l'extension Description n'est pas disponible.

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()); 
} 

Cela est bien et travaille à 2008s Visual Studio serveur de développement web, mais échoue avec une exception de transtypage lorsqu'il est exécuté sur IIS 6. Il est exécuté avec une immuable, hardcoded dénombrable comme paramètre de type pour remplir les pages ASP.

System.InvalidCastException: Invalid coulée de '% namespace.class + nameofenum%' à 'System.Enum. à System.Convert.DefaultToType (IConvertible valeur , type targetType, fournisseur IFormatProvider) à System.Convert.ChangeType (Object valeur , type conversionType, fournisseur IFormatProvider) à System.Linq.Enumerable.d__b0 1.MoveNext() at System.Linq.Enumerable.<SelectIterator>d__d 2. MoveNext() à System.Linq.Buffer source) à System.Linq.Enumerable.ToArray [TSource] (source IEnumerable`1 ) à AddEnum [T1] (me dropdownlist)

(espace de nommage/c Lassname obscurci par moi)

Je suis incapable de le tester sur d'autres versions d'IIS mais il semble très étrange que la version de développement ne correspond pas au système de production. Est-ce que quelqu'un sait pourquoi c'est comme ça?

Répondre

5

Tourné dans l'obscurité. L'une des plates-formes exécute 3.5 RTM et l'autre 3.5 SP1. Si c'est le cas, vous êtes probablement confronté à une modification de rupture introduite dans 3.5SP1 qui a modifié la façon dont .Cast() fonctionne. Voir ces messages pour plus de détails

+0

Beau travail, ils exécutent des versions différentes, mais malheureusement, nous ne seront pas mise à niveau du site de production bientôt. Merci pour l'aide. – Toby

Questions connexes