Перечислить массив в строки - PullRequest
0 голосов
/ 24 февраля 2011

У меня есть метод расширения ToString для IEnumerable, который преобразует его в список строк следующим образом:

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

Теперь я хочу сделать нечто подобное с массивом перечислений: учитывая XStatusesмассив значений перечисления XStatus, я хочу получить строку, содержащую значения перечисления, разделенные theSeparator.По какой-то причине вышеупомянутый метод расширения не работает для XStatus [].Поэтому я попытался

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

Но затем я получил ошибку, которая "не может использовать ... 'System.Enum' ... как ограничение параметра типа.

Есть ли способ достичьэто?

Ответы [ 2 ]

4 голосов
/ 24 февраля 2011

Не может быть сделано.Ближайшим будет where T : struct, и тогда будет выброшена ошибка в функции, если не Enum.

Редактировать: Если вы удалите where T : class из исходной функции, она будет работать и с перечислениями.Также пропустите ToArray(), поскольку String.Join принимает IEnumerable<string>

1 голос
/ 24 февраля 2011

Магнус прав, это не может быть сделано, элегантно. Ограничение можно обойти небольшим взломом, например так:

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