2011-02-24 3 views
0

J'ai une méthode d'extension ToString d'un IEnumerable, qui le convertit en une liste de chaînes comme suit:tableau Enum à cordes

public static string ToString<T>(this IEnumerable<T> theSource, 
            string theSeparator) where T : class 
    { 
     string[] array = 
        theSource.Where(n => n != null).Select(n => n.ToString()).ToArray(); 

     return string.Join(theSeparator, array); 
    } 

Je veux maintenant faire quelque chose de similaire avec un tableau de énumérations: theXStatuses données , un tableau de valeurs d'énumération XStatus, je veux obtenir une chaîne contenant les valeurs enum séparées par theSeparator. Pour une raison quelconque, la méthode d'extension ci-dessus ne fonctionne pas pour XStatus []. J'ai donc essayé

 public static string ToString1<T>(this IEnumerable<T> theSource,string theSeparator) 
                      where T : Enum 

Mais je suis une erreur « ne peut pas utiliser ... « System.Enum » ... comme contrainte de paramètre de type.

Est-il possible de ce achive?

.
+1

Ceci est C#, n'est-ce pas? Vous devriez ajouter ce tag à votre question (je le ferais mais je ne suis pas sûr à 100% que c'est du C#). – Pointy

Répondre

4

Aucun ne peut pas être fait le plus proche serait where T : struct et que de jeter une erreur dans la fonction sinon Enum

Edit:. Si vous supprimez where T : class de votre fonction d'origine, il wil Je travaille aussi sur des enums. En outre ignorer le ToArray() en tant que String.Join prend IEnumerable<string>

1

Magnus a raison, il ne peut pas être fait, élégamment. La limitation peut être contournée avec un petit hack, comme ceci:

public static string ToString<TEnum>(this IEnumerable<TEnum> source, 
          string separator) where TEnum : struct 
{ 
    if (!typeof(TEnum).IsEnum) throw new InvalidOperationException("TEnum must be an enumeration type. "); 
    if (source == null || separator == null) throw new ArgumentNullException(); 
    var strings = source.Where(e => Enum.IsDefined(typeof(TEnum), e)).Select(n => Enum.GetName(typeof(TEnum), n)); 
    return string.Join(separator, strings); 
}